为啥数组的索引/列表不以 1 开头? [复制]

Posted

技术标签:

【中文标题】为啥数组的索引/列表不以 1 开头? [复制]【英文标题】:Why doesn't the index/list of an array begin with 1? [duplicate]为什么数组的索引/列表不以 1 开头? [复制] 【发布时间】:2013-08-07 17:16:24 【问题描述】:

有什么特殊原因吗?我知道这就是语言的编写方式,但我们不能改变它吗? 如果索引以 1 开头,我们将面临哪些挑战?

【问题讨论】:

您在为此选择的语言中忘记了 Eiffel、Smalltalk 和 Prologue。 Why numbering should start at zero : Dijkstra 为什么不以-1开头? 【参考方案1】:

出于历史原因,以及与如何在内存中“制作”数组有关的原因。

在 C 中,数组是一块内存(在编译器级别有一些关于其大小的信息)。您有一个指向其第一个元素的指针(引用)。要转到它的第二个元素,您可以这样做

int array[10]; // your array

int *p = array; // reference to first element of array
int *q = p + 1; // reference to second element of array 
int *r = p + 2; // reference to third element of array 

显然,为了对称:

array[0] // reference to first element of array
array[1] // reference to second element of array
array[2] // reference to third element of array

C 的[x] 运算符实际上编译为array + x

你看到了吗?数组在 C 中是“base 0”。因此在许多其他语言中它是相同的。

现在,C++ 源于 C,Java 源于 C++ 和其他语言,C# 源于 C++、java 和其他语言......同一棵树。

显然是另一棵树:-)

【讨论】:

太好了,您在“许多其他语言中”提到过,因为从 0 开始的索引并不是一成不变的法律。 事实上,问题中的所有语言都是在 C 之上开发的。 但在Matlab 中,寻址从索引1 开始:) 数学参考:数轴的原点为零【参考方案2】:

其背后的基本原因是计算机记住了存储任何变量/对象的第一部分的地址。所以索引代表了它和你要找的东西之间的“距离”,所以第一个是 0,第二个是 1...

【讨论】:

【参考方案3】:

在 C 和 C++ 中,数组索引是取消引用偏移指针的语法糖。那是, array[i] 等价于 *(array + i)。指针指向其内存块的开头是有意义的,这意味着数组的第一个元素需要是*array,也就是array[0]

【讨论】:

【参考方案4】:

好问题。实际上,几乎所有的编程语言实现都从 0 开始索引。

虽然您可能会使用变通方法使其看起来像是从 1 开始,但不要这样做。

Dijkstra 的文章将比我能更好地防御基于零的数组:

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

【讨论】:

【参考方案5】:

有一件事是,您可以使用指针引用和导航数组。事实上,数组操作衰减到后端的指针算术。

假设您想要到达数组的nth 元素,那么您可以简单地执行(a + n) 其中a 是数组的基地址(一维),但如果下标从1 开始然后要到达nth 元素,您必须一直执行(a + n -1)

这是因为只要取一个数组的名字就可以得到它的起始元素的地址,这是最简单的方法!

【讨论】:

以上是关于为啥数组的索引/列表不以 1 开头? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有单个条目的python列表为-1索引和0索引提供第0个元素? [复制]

为啥具有负索引的数组有效? [复制]

为啥我不能索引mysql返回的数组? [复制]

如何确定索引是不是为列表/数组? [复制]

如何使用numpy查找数组中元素的索引? [复制]

如何删除数组中索引 X 处的项目? [复制]