在使用任何语言的数组时,我总是想知道为什么数组的基址或索引号从零开始。
int x[5]={21,34,55,314,45};
现在,如果我想访问数组的任何第一个值,我将不得不使用x[0]
,但为什么0背后有任何逻辑呢?
答案 0 :(得分:1)
在C中,数组的名称本质上是指针,对内存位置的引用,因此表达式array [n]指的是远离起始元素的内存位置n元素。这意味着索引用作偏移量。数组的第一个元素完全包含在数组引用的内存位置(0个元素之外),因此它应该表示为array [0]。大多数编程语言都是以这种方式设计的,因此从0开始的索引几乎是语言所固有的,因为大多数语言(并非所有)都遵循C标准。 您可以参考此link了解更多详情。
答案 1 :(得分:0)
一般来说,使用零索引数组的逻辑被认为更简单,一旦你将索引视为来自原点的偏移而不是作为"放在列表中的位置":你开始于列表的开头,第一个项目是您开始时的位置,即当您走零步时。
从某种意义上说,它从根本上说是武断的,而且可能是最好的答案。如果我们认为大多数现代语言都是由那些在职业生涯早期就学过C的人设计的,或者最近他们的设计基于那些C语言的语言,那么零索引数组的选择将是一个相当大的变化,需要很多理由,似乎没有人找到,或者甚至可能找不到。但是,如果真的有理由使用1索引数组,那么就没有任何真正的理由不使用它们。
当然,随着我们进入更现代的语言设计,关注数组元素索引的想法正在逐渐消失。例如,python程序员循环遍历如下索引:
for element in lst:
do_stuff_to(element)
因此没有理由关心指数。 Ruby甚至可以通过各种方式解决这个问题,我在这里不会说明这些问题,但你应该对此进行研究。
答案 2 :(得分:0)
当处理自然数的子序列时,上限和下限之间的差异应该是子序列的长度。数组的索引可以被认为是一种特殊的这种子序列。
下限应该是包含的,上限应该是独占的。换句话说,下限应该是数组的第一个索引。否则,我们冒险在一些子序列的非自然数上设置下限。
如果我们想要维持条件(1)和(2),那么我们有效地对上限和下限有两种选择:1< = i< N + 1或0< = i< N.显然,将N + 1放在范围内是很难看的,所以我们应该更喜欢从0开始编制索引。
答案 3 :(得分:0)
仅仅基于其他答案,索引是一个偏移量。创建数组时,程序会设置足够的连续内存位置以适应" fit"这个大小的数组。在C和相关语言中,变量存储指向第一个项目的指针。
假设每个位置是32位(可能是或可能不是真的)和第一个地址,比如说200.(是的,我确实认识到它在十进制中这可能很糟糕,但是忍受我)。第一项是地址(200 + (32 * 0)) = 200
。第二项是地址200 + (32 * 1) = 232
。第三项是地址200 + (32 * 2) = 264
。等
你可以在恒定时间内访问数组中任意项的主要原因是你可以只做指针运算来找到数组中的任意项,这可以在恒定时间内完成。