为什么很多编程语言中数组是从0开始编号?

从数组存储的内存模型上来看,“下标"最确切的定义应该是"偏移(offset)”。对于一个数组,如果用a来表示数组的首地址,a[0]就是偏移为0的位置,也就是首地址,a[k]就表示偏移K个type_size的位置,所以计算a[k]的内存地址只需要用这个公式:

a[k]_address = base_address + k * type_size

但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为:

a[k]_address = base_address + (k-1)*type_size

对比两个公式,可以看出从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法运算指令。
数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从0开始编号,而不是从1开始编号
另外当然不是所有的编程语言都是从0开始编号,比如python

原文地址:https://www.cnblogs.com/liuurick/p/10713677.html