部分来源于其他博客

为什么数组的下标是从0开始,而不是从1开始呢?从1开始不是更符合人们的习惯么。

数组(Array)一种线性表数据结构,用一组连续的内存空间,存储一组相同类型的数据

线性表(Linear List),每个线性表上最多有前后两个方向。 数组、队列、链表、栈都是线性表结构

非线性表,如二叉树、堆、图等。在非线性表中,数据不是简单的前后关系。

连续的内存空间和相同的数据结构,使其可以“随机访问”,弊端也很明显,某些操作十分低效。在数组中删除或插入数据时,要做大量的数据搬移工作。

从数组中存储的数据模型来看,下标最精确的意思是”偏移量“,a[0]的偏移量是0,即为首地址。a[i]的偏移量是i,寻址公式就是a[i]_address = base_address + i*data_type_size

如果下标从1开始,那对应的寻址公式a[i]_address = base_address + (i-1)*data_type_size
对CPU来说,每次随机访问,就多了一次运算,多发一条指令。

上面的解析,算不上压倒性的证明。当初C语言的设计者用0开始计数数组下标,之后java、javaScript等高级语言都仿效了C语言,这也减少了C语言程序员学习java的成本。

简单来说,就是

假如数组的首地址 是 base_address

如果索引从 1 开始计,元素 a[1] 是第一个元素,它的地址就是 base_address,当我们要获取第 8 个元素 a[8] 的数据时,计算机就要找到元素 a[8] 所在的地址,计算公式就是 base_address + (8-1)* type_size 。

如果索引从 0 开始计,元素 a[0] 是第一个元素,它的地址就是 base_address,当我们要获取第 8 个元素 a[7] 的数据时,计算机就要找到元素 a[7] 所在的地址,计算公式就是 base_address + 7 * type_size 。

我们发现,索引从 0 开始,寻址时会少做一次减法,这就是一个优化,别小看这种优化,计算的数量一旦上去,比如上亿次计算,那积累起来的优势是相当可观的。

其实,各种算法的优化,本质都是一样的,让计算机做更少的计算,只有做的事情少了,效率才会提高。

数组的下标为什么从0开始相关推荐

  1. 790-C语言的数组元素下标为何从0开始?

    C语言的数组元素下标为何从0开始? 我们在学习数组时会有这个疑问,数组元素的下标为什么不从1开始呢? 从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个. 的确,有些计算机语言如 ...

  2. C语言数组元素下标为何从0开始

    很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个.的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从 ...

  3. 数组的下标为什么从0开始而不是从1开始

    数组是一段连续的空间,要求a[i]就是求它的地址,然后找到它. 如果从0开始,则a[i]的地址= 首地址 + i*每个数据所占的长度: 如果从1开始,则a[i]的地址= 首地址 + (i-1)*每个数 ...

  4. 为什么数组的下标是从0开始而不是从1开始?

    一.数组下标从0开始的原因 在回答这个问题之前我们首先要明确一点那就是对于数组元素的访问在操作系统层其实就是对特定内存偏移量的数据的访问,换而言之即如果想要访问一个数组的某一个元素的值那么首先就要计算 ...

  5. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc

    C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...

  6. java数组下标0_Java语言中数组元素下标从0开始。

    [单选题]规范规定,硅酸盐水泥的初凝时间不小于( ). [判断题]打开/关闭"对象追踪"的功能键是F11. [判断题]break语句的作用是结束当前的循环体. [单选题]项目标识代 ...

  7. 为什么数组的下标从 0 开始?

    微信搜索 [微观技术],关注这个不喜欢内卷的程序员. 精彩文章汇总 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ...

  8. java数组最大下标_【Java视频教程】day09-面向对象

    面向对象介绍 面向对象引入 需求:求数组{1,2,3,4,8,7,6,5}的最大值: public static void main(String[] args) {// 需求:求数组{1,2,3,4 ...

  9. java规定数组的下标_Java数组元素下标的范围是

    Java数组元素下标的范围是 答:0~数组名.length-1 关于产妇产褥期临床表现,下列哪项是正确的 答:母乳喂养可以促进子宫复旧 不属于社会主义时期我国政治生活的主题是( ) 答:解决敌我矛盾 ...

最新文章

  1. 基于线段的激光雷达和单目联合曲面重建​
  2. HTML POST提交参数给PHP并返回json,上传execl文件
  3. TensorRT trtexec的用法
  4. TypeScript Type Compatibility 类型兼容性
  5. thinkcmf搭建教程_5分钟快速入门
  6. Debian 系统安装 Nagios 服务器监控端
  7. 2019.03.06 22.25
  8. d3 v4 api transitions
  9. Oracle数据库分页总结
  10. Linux无root权限安装cuda9.1和cudnn7.05以及编译框架时无lcuda.so的问题
  11. python技术简介_Python多线程技术简介,简单,阐述,python
  12. python处理时间的标准函数库_使用Python的datetime库处理时间(RPA流程)
  13. Eigen按行或列求和的使用
  14. linux shell 学习时遇到的一些问题([: 11: y: unexpected operator)
  15. 设计之星 ai_漫画 |《钢铁之星》:AI肆虐的时代,夹杂人类阴谋
  16. AI绘画网站最全收集!!
  17. 实现windows与ubuntu的之间的复制与粘贴
  18. 介绍一款最快速便捷的一键重装系统软件,全程只需要十分钟,免激活系统
  19. 职业经理人影响力自检手册(二)
  20. stm32f103rct6最小系统原理图

热门文章

  1. VIM(Neovim)基本概念与高效使用方法
  2. H - Oulipo
  3. 第零次作业——田佳欣,2016011911
  4. Oracle创建employee表,oracle之创建和管理表之练习题
  5. 更改mysql端口(全程细致)
  6. 点云凹凸性检验(2/2)
  7. matplotlib笔记三:表格样式
  8. 游戏引擎Flax Engine源码分析(十一)渲染
  9. Android 打开webView黑屏闪烁问题排查
  10. Oracle ACFS、ADVM