
数组
为什么数组都是从 0 开始编号,首先先了解一下数组的概念。
数组 Array 是一种线性表数据结构,是一组连续的内存空间,用来存储一组具有相同类型的数据。数组具备以下特性:
一维数组寻址公式:
a[k]_address = base_address + k * type_size二维数组寻址公式:
假设二维数组大小为 m*n,那么寻址公式为:
a[i][j]_address = base_address + (i * n + j) * type_size三维数组寻址公式:
假设是 m*n*q,那么寻址公式为:
a[i][j][k]_address=base_address + (i * n * q + j * q + k) * type_size其中 type_size 表示数组中每个元素的大小。
例如,声明一个长度为 10 的 int 类型的数组。
int arr[10] = { 0 };
for (int i = 0; i < 10; i++) {
arr[i] = i;
}运行结果如下,

image.png
从运行结果可以看出,计算机给数组 arr,分配了 40 字节的内存,首地址为 0x7ffeefbff4f0,arr[0] 地址为:0x7ffeefbff4f0,arr[9] 地址为:0x7ffeefbff514,每个 int 有 4 个字节,故 arr[9] 结尾为 0x7ffeefbff514。
在 C 语言中数组名代表首地址,即第一个元素的地址,a[0] 就是偏移为 0 的位置,a[k] 就表示偏移 k 个元素类型大小的位置。得出计算公式:
a[k]_address = base_address + k * type_size如果数组编号从 1 开始计数,那这个公式就会变为:
a[k]_address = base_address + k * type_size
a[k]_address = base_address + (k-1) * type_size对比两个公式,如果从 1 开始编号,每次随机访问数组元素就多了一次减法运算,对于 CPU 来说就是多了一次减法指令,增加了性能开销。