数组两个特性
为什么数组都是从 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
来说就是多了一次减法指令,增加了性能开销。
网友评论