美文网首页codeER.tec
为什么数组都是从0开始编号

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

作者: s_在路上 | 来源:发表于2018-10-30 09:54 被阅读39次
    数组

    数组两个特性

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

    相关文章

      网友评论

      本文标题:为什么数组都是从0开始编号

      本文链接:https://www.haomeiwen.com/subject/gmbwtqtx.html