背景

早在linux操作系统诞生开始,c语言作为linux系统的编程语言主力,它为后续的其他高级编程语言(如c++、java)提供了很多语言级的语义和协议规范。

数组做为linux操作系统最基本的数据结构之一,便是其中的一项语言级高级特性,深入理解数组有助于大家更深入的了解计算机系统原理。

寻址:从0开始

首先,我们了解下数组的基本特性

1、线性表结构

2、一组连续的内存空间

3、存储相同类型数据

由数组的基本特性可知:数组所申请的内存是一段连续的内存地址,其存储的是相同类型的值。

从其数组内存模型定义来看,数组的访问是从首地址(偏移量为0)开始,如果想访问下一个数组元素,需要把位置偏移,也就是数组内存寻址时,需要把偏移量变为1,以此类推。

计算数组内存寻址公式:

array[i] = base_address + i * data_type_size

参数说明

  1. base_address 首地址array[0] ,数组第一个元素内存地址
  2. i 为偏移量
  3. data_type_size 数据类型字节大小

举个例子:

1、定义一个int 数据类型的数组,a为变量,数组长度为5

int[] a=new int[5]

2、假设数组地址:

  1. 第一个内存地址为:1008
  2. 第二个为:1009
  3. 第三个为:1010
  4. ...

3、寻址:由公式:array[i] = base_address + i * data_type_size

a[0]——把a拿到的内存地址:

1008 + 0 = 1008 (指向第一个内存地址)

a[1]——把a拿到的内存地址:

1008 + 1 = 1009 (指向第二个内存地址)

a[2]——把a拿到的内存地址:

1008 + 2 = 1010 (指向第三个内存地址)

以此类推。。。

关心话题(一):数组下标为什么不从1开始

cpu消耗

如果数组从1开始编号,公式为a[i] = base_address + (i -1) * data_type_size,对cpu而言,”i -1“就多了一次减法指令。

历史原因

c语言的设计者使用了0开始编号,后续的很多高级编程语言也就沿用了这个规范,降低额外的学习和理解成本。

关心话题(二):随机访问

由于数组是线性结构,那么根据首地址和偏移量就可以计算出任意数组元素的内存地址

array[i] = base_address + i * data_type_size

java面试题:数组和链表的区别

1、链表适合插入和删除,时间复杂度是O(1)

2、数组适合查找,查找的时间复杂度为O(1)

究其原因是数组支持随机访问,根据下标随机访问的时间复杂度是O(1),而链表需要从头开始寻址,直到找到对应的元素地址才结束,其复杂度为O(logn)

关心话题(三):集合能替代数组吗?

数组和集合最大一个区别于在于数组能直接存储基本的数据类型(如int、float、long等);而集合只能通过装箱和拆箱存储基本数据类型,代价是需要消耗性能。另外使用多维数组时,用数组会直观一些。

jvm标记清除算法

为了避免数组大规模的数据搬移,可以将k位置的数据直接搬移到数组末尾位置,再把新数据放到k位置。删除时,可以将要删除的数据标记下来,当数组没有足够的空间时,将标记的数据统一删除,就可以提高很大的性能,也就是jvm标记清除垃圾回收的思想 。

总结

大部分高级程序语言的数组下标是从0开始的,而python数组下标却可以支持负数 。

最后

如果觉得本文对您有帮助的话,记得关注、转发哦,我会为大家持续提供原创干货。需要资料,请关注、转发,私信“资料”面试+微服务+springboot资料免费赠送。

sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意相关推荐

  1. mate7 android 6 root权限管理,华为Mate7 6.0 root教程_华为Mate7获取6.0系统的root方法

    看到很多机友的华为Ascend Mate7手机系统已经升级到6.0的系统了,可是对于6.0的系统如何进行root呢,很多机友还是比较茫然,所以在这里整理了一下详细的root教程供大家参考了,这个roo ...

  2. 三星 android 5.0 root,三星E330S 5.0 root教程_三星E330S获取5.0系统root的方法

    三星E330S的5.0系统的固件包已经出来了,是官方更新的,已经有机友通过升级的方式升级到5.0的系统了,不过很多人是通过刷机的方式来刷入的,总而之而,不管是哪种方式,只要是手机系统成了5.0的系统之 ...

  3. 三星android 7.0 root,三星G9350 7.0 root教程_三星G9350获取7.0系统的root权限

    咱们的三星G9350手机系统最新版本是安卓7.0的,这一节主要来说说咱们的手机这个手机如何进行root了,这个root操作也是针对7.0的系统进行操作的,因为7.0的系统和之前6.0的系统不同,用6. ...

  4. java随机数去重排序_数组去重及排序/0~10随机数字/字符串中出现最多的字符及次数...

    数组去重及排序: var arr = [1,5,1,2,6,8,1,81,9,0]; for(var i=0;i for(var j=i+1;j if(arr[i] == arr[j]){ arr.s ...

  5. 新云asp转php,新云CMS 4.0 转换 PHPcom 1.3.0 工具下载_新云CMS 4.0 转换 PHPcom 1.3.0 工具官方下载-太平洋下载中心...

    本程序只适合 sql server 版本转换,如果你用的是 Access 版,请先转换为 SQL 版后再进行升级. 转换说明: 一.下载 PHPcom 内容管理系统 1.3.0 和 新云转换工具 二. ...

  6. 获取当天0点时间_什么是股市T+0?该如何做T?

    无论是短线.波段.中线,还是盈利中.套牢中,经常做T远比持股不动好,尤其在大盘震荡.下跌期间,盘中做T是一种非常稳健.高效的套利手段! 只要进入股市,总会有被套的时候. 一般而言,股票被套后有两种应对 ...

  7. sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root

    来说一下咱们的索尼Xperia Z2手机的5.0系统的root,因为现在很多机友的系统是5.0的,可是对于5.0的系统很多机友还不知道如何进行root操作,之前的针对4.4的系统的root方法肯定是用 ...

  8. android 9.0 权限管理_你真的了解Android权限机制吗?

    码个蛋(codeegg)第 610 次推文 作者:FeelsChaotic 原文:https://www.jianshu.com/p/a17c8bed79d9 前言 Android将安全设计贯穿系统架 ...

  9. java web 2.0 下载地址_《征服Ajax Web2.0快速入门与项目实践(Java)》[PDF]

    征服Ajax Web2.0快速入门与项目实践(Java) 作者:张桂元 贾燕枫 姜波 基本信息 ·出版社:人民邮电出版社 ·页码:300 页 ·出版日期:2006年 ·ISBN:7115148031 ...

最新文章

  1. 从根因入手,更有效率,效果也更好
  2. 关于第十五届全国大学生智能车竞赛 STC 单片机
  3. Android多个权限多次请求,android – 获取W / Activity:一次只能请求一组权限
  4. PCB的地与机壳(连接大地)为什么用阻容连接?
  5. matlab c++ 画图【转载】
  6. 2014年12月福建省高等学校计算机应用水平等级考试考试大纲,福建省高等学校计算机应用水平等级考试...
  7. boost::gil::view_is_basic用法的测试程序
  8. linux jenkins部署之路之,ftp部署怎么匿名还好用咋解决思密达
  9. 关于窗口跳转的一些总结
  10. xilinx官方教程ug871利用HLS实现RealFFT
  11. pytorch笔记-实现一个图像分类模型
  12. centos node 进程保护_NodeJs之进程守护
  13. c++语言 进行验证码识别,C++ 借助 Tesseract-OCR 识别乐讯新版验证码
  14. RedisCrawlSpider爬取当当图书信息
  15. 爱数私有云盘 AnyShare 部署(二)
  16. python网络爬虫框架内容_Python网络爬虫-Scrapy框架
  17. PPT文件太大了怎么压缩
  18. Electron“安装已中止,安装程序未成功地运行完成”
  19. VM虚拟机win2003桥接模式本地连接受限制问题
  20. 【模型开发】评分卡应用

热门文章

  1. 微软发布正式版SQL Server 2016
  2. 基于CefSharp构建基于Chromium的应用程序
  3. C# 检查当前系统已安装的程序app/两种方法检测
  4. 03.JavaScript对DOM操作
  5. [转]阿里开源低代码引擎LowCodeEngine
  6. Android之解决APP奔溃重启导致Fragment白屏问题
  7. Android之UI线程与子线程交互设计的5种方法
  8. Qt 第二步 熟悉文件结构组成(二)
  9. php Heredoc应用说明
  10. 【C语言简单说】十三:逻辑运算符||