codeER.tec

为什么数组都是从0开始编号

2018-10-30  本文已影响39人  s_在路上
数组

数组两个特性

为什么数组都是从 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 表示数组中每个元素的大小。

验证

例如,声明一个长度为 10int 类型的数组。

int arr[10] = { 0 };
for (int i = 0; i < 10; i++) {
    arr[i] = i;
}

运行结果如下,

image.png

从运行结果可以看出,计算机给数组 arr,分配了 40 字节的内存,首地址为 0x7ffeefbff4f0arr[0] 地址为:0x7ffeefbff4f0arr[9] 地址为:0x7ffeefbff514,每个 int4 个字节,故 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 来说就是多了一次减法指令,增加了性能开销。

上一篇下一篇

猜你喜欢

热点阅读