0

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

4

5 回答 5

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

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

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

于 2013-08-07T17:20:21.180 回答
3

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

于 2013-08-07T17:23:36.933 回答
3

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

于 2013-08-07T17:20:48.710 回答
1

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

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

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

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

于 2013-08-07T17:22:15.280 回答
1

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

假设你想到达一个nth数组的元素,那么你可以简单地做一个数组(a + n)a基地址(一维),但如果下标从那时开始,1nth就必须一直这样做(a + n -1)

这是因为只需使用数组的名称即可获得它的起始元素的地址,这是最简单的方法!

于 2013-08-07T17:23:00.807 回答