为什么数组的索引/列表不以1开头?

时间:2013-08-07 17:16:25

标签: java c++ python c coding-style

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

5 个答案:

答案 0 :(得分:6)

由于历史原因,以及与数据如何在内存中“制造”有关的原因。

在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中是“基数0”。因此在许多其他语言中它是相同的。

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

基本显然是另一棵树: - )

答案 1 :(得分:3)

背后的基本原因是计算机会记住存储任何变量/对象的第一部分的地址。所以索引代表"距离"介于那个和你正在寻找的东西之间,所以第一个是0,第二个是1 ......

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

虽然你可能会使用变通办法使它看起来像是从1开始,但不要。

Dijkstra的文章将为我提供比基于零的阵列更好的防御:

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

答案 4 :(得分:1)

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

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

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