为什么数组中的索引总是以 0 开头?它与二进制有关吗?例如:
var myArray = [5,6,7,8];
要访问数字 5,您必须说
myArray[0]
但为什么?
不,我没有真正的问题。正如您显然可以告诉我的那样,我对这些东西很陌生。
为什么数组中的索引总是以 0 开头?它与二进制有关吗?例如:
var myArray = [5,6,7,8];
要访问数字 5,您必须说
myArray[0]
但为什么?
不,我没有真正的问题。正如您显然可以告诉我的那样,我对这些东西很陌生。
我敢肯定这已经被问过一百次了,但我会咬人的。
查看“索引”或“键”的一种方法是作为“偏移量”。
myArray
本质上充当指向一系列项目中第一个项目的指针。具体来说,它指向内存中的数字“5”。所以当你说myArray[1]
这就像说“第一个元素的位置myArray
加上 1 个项目”时,你会跳过第一个元素。
在 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 而不是 1 开始的,因为如果你从 0 开始,你可以在一个数字中数出多达十个总数。
你显然是新手,相信我,从现在开始,你会数 0 , 1 , 2 , 3 !
维基百科给了我们这样的解释:
索引来源
一些语言,例如 C,只提供从零开始的数组类型,任何索引的最小有效值为 0。这种选择便于数组实现和地址计算。使用诸如 C 之类的语言,可以定义指向任何数组内部的指针,该指针将象征性地充当容纳负索引的伪数组。这仅是因为 C 在使用时不会检查索引是否符合界限。其他语言仅提供基于 1 的数组类型,其中每个索引从 1 开始;这是数学中关于矩阵和数学序列的传统约定。一些语言,如 Pascal,支持基于 n 的数组类型,其最小合法索引由程序员选择。每个选择的相对优点一直是激烈争论的主题。 从零开始的索引比从一开始的索引在避免非一或栅栏错误方面具有天然的优势。有关各种语言使用的基本索引,请参见编程语言(数组)的比较。
在 Javascript 中,与许多其他语言一样,数组总是从索引零开始,但并非所有语言都如此。
例如,在 Pascal 中,您定义了下边界和上边界,因此您可以在索引 3 处开始一个数组:
var myArray: Integer[3..6];
从零开始数组是最常见的,因为当您访问项目时这是最有效的。如果您从任何其他索引开始,则在计算存储项目的地址时必须减去该值。这种额外的计算在今天不会成为问题,但在构建像 C 这样的语言时肯定会成为问题。
(好吧,Javascript 中的数组实际上与大多数其他语言的访问方式完全不同,但它使用从零开始的索引,因为大多数类似的语言,灵感来自的地方,都这样做。)