数组中的第一个元素

3
为什么数组的索引总是从0开始?这与二进制有关吗?例如:
var myArray = [5,6,7,8];

要访问数字5,您需要说

myArray[0]

但是为什么呢?

不,我没有真正的问题。显然你可以看出我对这些东西很新。


7
欢迎来到计算机科学领域。 - Jacob Pollack
你有实际需要解决的问题吗,还是只是为了教育目的? - Erik Philips
1
http://en.wikipedia.org/wiki/Zero-based_numbering 零基底编号http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html EWD831:关于“零”的问题 - Emilio Gort
从维基链接中可以看到:“瑞士联邦铁路将某些类别的动车组编号为零”。我想这是一个很好的理由吧 ;) - Andy G
那个维基百科页面非常棒!我建议选择它而不是其他可能的阅读材料。 - CamelopardalisRex
5个回答

2

我相信这个问题已经被问答了数百次,但我还是来回答一下。

从某种角度来看,“索引”或“键”可以看作是“偏移量”。

myArray 本质上充当了一个指向一系列项目中第一个项目的 指针。具体而言,它指向内存中的数字“5”。因此,当您说myArray[1]时,就相当于说“在myArray的第一个元素位置跳过一个元素”,进而会跳过第一个元素。

在C语言中,当您写*myArray(指针解引用)时,它实际上会将第一个元素返回给您。

#include <stdio.h>

int main(void) {
    int myArray[] = {5,6,7,8};
    printf("%d",*myArray); // prints "5", equivalent to myArray[0]
    printf("%d",*(myArray+1)); // prints "6", equivalent to myArray[1]
    return 0;
}

除了“计算机就是这样工作”的理由外,还有比这更实际的原因。

(参考链接:更多实用资料



0
在JavaScript中,就像许多其他语言一样,数组始终从索引零开始,但并非所有语言都是这样。
例如,在Pascal中,您可以定义下限和上限,因此可以从索引三开始定义一个数组:
var myArray: Integer[3..6];

在编程中,数组通常从零开始,因为这样访问项目时最有效。如果从任何其他索引开始,则在计算存储项的地址时必须减去该值。虽然在今天,这种额外的计算不是问题,但在像C语言这样构建的语言出现之前,它肯定是问题。

(好吧,在Javascript中,数组实际上与大多数其他语言完全不同,但使用基于零的索引,因为大多数类似语言都是如此,灵感来自这些语言。)


0

这是基本的计算机科学知识,它回溯到内存非常有限的时代,一切都从0开始而不是1,因为如果你从0开始,你可以在一个数字中计数十个总数。

你显然是新手,相信我,从现在开始,你将会数0、1、2、3!


0

维基百科给出了以下解释:

索引起点

一些语言(如C语言)仅提供从零开始的数组类型,对于这种类型的数组,任何索引的最小有效值都是0。这种选择对于数组实现和地址计算非常方便。在像C这样的语言中,可以定义指向任何数组内部的指针,该指针将象征性地充当一个伪数组,以容纳负索引。这仅适用于C不在使用时检查索引是否超出范围。其他语言仅提供从1开始的数组类型,其中每个索引都从1开始;这是矩阵和数学序列的传统约定。少数语言(如Pascal)支持n-based数组类型,其最小合法索引由程序员选择。每种选择的相对优点一直是激烈辩论的主题。与从1开始的索引相比,从0开始的索引在避免偏移一或栅栏错误方面具有自然优势。请参见各种语言使用的基础索引的编程语言(数组)比较。

在此处阅读更多关于数组的信息

在这里阅读更多关于off-by-one和fencepost错误的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接