为什么C语言的数组从零开始呢?我觉得要理解这个问题,首先要有两个概念——地址和偏移。
注意下面两个语句:
array[10]
和
*(array+10)
这两条语句都是指向同一个元素。这两条语句是等价的。
即是说,array[0]就是*(array+0)
数组的下标就是对array这个数组进行偏移。这是硬件特性决定的。
因为数据都是存放在内存地址里的,而数据的获取方式,是先得到一个数据的地址,然后对其进行偏移。
如果数组从1开始计算,那么获取数组的第一个元素表达方式就是array[1]
但是数组的第一个元素的地址就是array,CPU每次获取元素需要减去1。
即必须这样做:*(array + 1 - 1)
其中+1操作是数组的下标,-1操作是为了获得正确的元素地址。
如果数组从1开始,会多了减1这个操作,增加了CPU的运算,浪费CPU资源。
为了提高CPU的效率,只需要简单把数组从1开始修改为从0开始就可以了。
如果还不是很明白,可以看一下等差公式
an=a1+(n-1)d
其中n是第n个,d是两个数之间相差的数,这里设为1。
于是CPU为了获取数组的第n个元素,首先获得a1的地址,然后再从该地址出发,加上n-1,此时的地址就是所需的元素地址。但是每次都要进行-1操作,-1操作也是要消耗时间的,这样很浪费CPU资源。于是语言设计者决定数组从0开始,这样这公式就可以化为
an=a0+n
少了-1这一步骤,提高了CPU的效率。