2017-01-08 51 views
-1

在处理任何语言的数组时,我总是想知道为什么数组的基地址或索引号从零开始。为什么数组索引或基索引以0开头?

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

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

+0

本文解释得相当好:https://skillcrush.com/2013/01/17/why-programmers-start-counting-at-zero/ –

+0

http://softwareengineering.stackexchange.com/questions/70612/why-are-structs-arrays-zero-based –

+2

不**任何**语言,例如,Lua数组以索引'1'开始。 –

回答

1

在C中,数组的名称基本上是一个指针,指向一个内存位置,所以表达式array [n]指向一个内存位置n元素远离起始元素。这意味着索引被用作偏移量。数组的第一个元素完全包含在数组引用的内存位置(0个元素以外),所以它应该表示为数组[0]。大多数编程语言都是以这种方式设计的,因此从0开始编制索引是语言的固有内容,因为大多数语言(并非全部为)都遵循C标准。 您可以参考此link了解更多详情。

+0

不客气。 – DnA

0

通常,使用零索引数组的工作逻辑被认为更简单,一旦您将索引视为来自原点的偏移量而不是“列表中的位置”:您从开始时列表,第一项是你开始时的地方,即你走了零步。

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

当然,随着我们进入更现代化的语言设计,关心数组元素索引的想法正在从相关性退化。例如,python程序员循环索引,如下所示:

for element in lst: 
    do_stuff_to(element) 

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

0
  1. 当使用自然数的子序列时,上边界和下边界之间的差异应该是子序列的长度。数组的索引可以被认为是一种特殊的这种子序列。

  2. 下限应该是包含的,上限应该是排他性的。换句话说,下限应该是数组的第一个索引。否则,对于某些子序列,我们冒着不自然数的下限。

  3. 如果我们希望保持条件(1)和(2),那么,我们有效地对上两个选择和下限:1 < = I < N + 1或0 < = I < N.显然,把在N + 1是丑陋的,所以我们应该更喜欢索引从0

0

开始只是为了建立在其他的答案,该指数的偏移量。当你创建一个数组时,程序会设置足够的连续内存位置来“适合”这个大小的数组。在C语言和相关语言中,变量正在存储指向第一个项目的指针。

假设每个位置都是32位(可能或不可能是真的)和第一个地址,比如说200.(是的,我意识到使用十进制这样做可能很糟糕,但是忍受我)。第一项是地址(200 + (32 * 0)) = 200。第二项是地址200 + (32 * 1) = 232。第三项是地址200 + (32 * 2) = 264。等等

您可以在常量时间内访问数组中的任意项的主要原因是您可以只进行指针算术来查找数组中的任意项,这可以在常量时间内完成。