数组
这里我们拿一维数组举例
一维数组说开了就是一组连续的数值,这组数值存储在一段连续的内存空间之中,只是不一样的是,若是我们不定义数组我们来访问这一连串的数值需要n个变量对应这n个数值或是需要一个指针进行遍历。只是现在我们为这一组值起了个名字而已,以后我们便可以通过这个名字+下标来访问这一组值了
下标
下标这玩意确切的定义应该是偏移,如果用array来表示一个数组的首地址,那array[0]其实也就是这个首地址,array[index]就表示偏移了index个type_size(每个数组元素占用内存的大小),所以计算array[index]的内存地址就是
1 | array[index]_address = base_address + index * type_size; |
如果下标从1开始计算那么这个内存计算公式就要改为
1 | array[index]_address = base_address + (index - 1) * type_size; |
每次都会多执行一次减法运算
效率原因
下标从1开始,每次访问数组元素都需要多执行一个减法运算。
其他历史原因
C语言设计者用0开始计数数组下标,可能大家用的习惯或者觉得原理好理解,之后的Java、JavaScript 等高级语言都效仿了 C 语言,同时也减少新语言的学习成本把。当然不是所有语言都是下标从0的开始的,还有些语言下标都能负数了,比如说python