【问题标题】:Why does an array index or base index start with 0?为什么数组索引或基索引以 0 开头?
【发布时间】:2026-02-01 05:25:01
【问题描述】:

在使用任何语言的数组时,我一直想知道为什么数组的基地址或索引号从零开始。

int x[5]={21,34,55,314,45};

现在,如果我想访问数组的任何第一个值,我将不得不使用x[0],但为什么 0 这背后有任何逻辑?

【问题讨论】:

标签: arrays


【解决方案1】:

在 C 中,数组的名称本质上是一个指针,是对内存位置的引用,因此表达式 array[n] 指的是距离起始元素 n 个元素的内存位置。这意味着索引被用作偏移量。数组的第一个元素恰好包含在数组引用的内存位置(0 个元素之外),因此应将其表示为数组 [0]。大多数编程语言都是这样设计的,因此从 0 开始索引几乎是该语言固有的,因为大多数语言(不是全部)都遵循 C 标准。 您可以参考此link 了解更多详情。

【讨论】:

    【解决方案2】:

    一般来说,使用零索引数组的逻辑被认为更简单,一旦您将索引视为相对于原点的偏移量而不是“列表中的位置”:您从列表的开头开始, 第一项是你开始时所处的位置,即,当你走零步时。

    不过,从某种意义上说,它基本上是任意的,并且可能约定是最好的答案。如果我们认为大多数现代语言是由在职业生涯早期学习 C 的人设计的,或者最近他们的设计基于那些受 C 启发的语言,那么选择零索引数组将是一个相当大的变化,将需要大量的理由,似乎没有人找到,甚至可能寻找。但是,如果有真正的理由使用 1 索引数组,那么没有任何真正的理由不使用它们。

    当然,随着我们进入更现代的语言设计,关注数组元素索引的想法正在逐渐远离相关性。例如,python 程序员循环遍历这样的索引:

    for element in lst:
      do_stuff_to(element)
    

    因此没有理由关心索引。 Ruby 甚至有更时髦的方法来处理这个问题,我不会在这里说明,但你应该研究一下。

    【讨论】:

      【解决方案3】:
      1. 在处理自然数的子序列时,上限和下限之间的差应该是子序列的长度。数组的索引可以被认为是一种特殊的子序列。

      2. 下限应该包含,上限应该不包含。换句话说,下界应该是数组的第一个索引。否则,我们可能不得不为某些子序列设置非自然数的下限。

      3. 如果我们想保持条件 (1) 和 (2),那么我们实际上有两个选择上限和下限:1

      【讨论】:

        【解决方案4】:

        只是建立在其他答案的基础上,索引是一个偏移量。当您创建一个数组时,程序会布置足够的连续内存位置以“适应”该大小的数组。在 C 和相关语言中,变量存储指向第一项的指针。

        假设每个位置都是 32 位(可能是也可能不是),并且第一个地址是 200。(是的,我确实意识到以十进制执行此操作可能很糟糕,但请耐心等待) .第一项位于地址(200 + (32 * 0)) = 200。第二项位于地址200 + (32 * 1) = 232。第三项位于地址200 + (32 * 2) = 264。等等。

        您可以在恒定时间内访问数组中的任意项的主要原因是您可以通过指针运算来找到数组中的任意项,这可以在恒定时间内完成。

        【讨论】:

          【解决方案5】:

          计算经常(但并非总是)涉及模块化算法,因为我们正在对保存在连续内存块中的数据项进行操作,这些内存块本身以设置的宽度和/或高度的数组或扇区或柱面物理布局。在到达极端列的内存元素后,我们希望我们的增量器返回到下一行的第一个元素。

          是的,我们可以通过:

          增量

          i :=  (i % n)  + 1
          

          递减

          i :=  (n +  i - 2) % n  + 1
          

          但使用从零开始的索引会更清晰、更有效:

          增量

          i :=   (i + 1) % n  
          

          递减

          i :=   (n +  i - 1) % n 
          

          【讨论】: