Mas*_*uso 111
在C中,数组的名称本质上是指针,对内存位置的引用,因此表达式array [n]指的是远离起始元素的内存位置n元素.这意味着索引用作偏移量.数组的第一个元素完全包含在数组引用的内存位置(0个元素之外),因此它应该表示为array [0].
了解更多信息:
http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html
Ani*_*han 100
这个问题是在一年前发布的,但是这里......
虽然Dijkstra的文章(以前在现在删除的答案中引用)从数学角度来看是有意义的,但在编程方面它并不那么重要.
语言规范和编译器设计者所做出的决定是基于计算机系统设计者决定从0开始计数.
引自丹尼科恩的和平辩护.
对于任何基数b,仅当编号从0开始时,第一个b ^ N个 非负整数由正数N个数字(包括前导零)表示.
这可以很容易地测试.在base-2中,取2^3 = 8
第8个数字是:
111可以使用3位表示,而1000需要额外的位(4位).
计算机存储器地址具有2^N由N位寻址的单元.现在,如果我们从1开始计数,则2^N单元格需要N+1地址线.需要额外的位才能正确访问1个地址.(1000在上述情况下).另一种解决方法是让最后一个地址无法访问,并使用N地址线.
与开始计数为0相比,两者都是次优解决方案,这将使用精确的N地址线保持所有地址的可访问性!
开始计算的决定0已经渗透到所有数字系统,包括在其上运行的软件,因为它使代码更容易转换为底层系统可以解释的内容.如果不是这样,那么对于每个阵列访问,机器和程序员之间会有一个不必要的转换操作.它使编译更容易.
引用论文:

Dou*_* T. 26
因为0是指向数组头部的指针到数组的第一个元素的距离.
考虑:
int foo[5] = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
要访问0,我们会:
foo[0]
Run Code Online (Sandbox Code Playgroud)
但是foo分解为指针,并且上面的访问具有类似的指针算术方式来访问它
*(foo + 0)
Run Code Online (Sandbox Code Playgroud)
这些天指针算术不经常使用.回过头来的时候,这是一个方便的方法来获取一个地址并将X"整数"从该起点移开.当然,如果你想留在原地,你只需加0!
Bra*_*vic 22
因为基于0的索引允许...
array[index]
Run Code Online (Sandbox Code Playgroud)
......实施为......
*(array + index)
Run Code Online (Sandbox Code Playgroud)
如果index是从1开始的,编译器需要生成:*(array + index - 1),而这个"-1"会损害性能.
pro*_*rmr 12
因为它使编译器和链接器更简单(更容易编写).
参考:
"...通过地址和偏移量引用内存直接在硬件上直接表示在所有计算机体系结构上,因此C中的这种设计细节使编译更容易"
和
"......这使得实施更简单......"
出于同样的原因,当它是星期三,有人问你到星期三多少天,你说0而不是1,当它是星期三,有人问你到星期四多少天,你说1而不是2.
小智 5
数组索引始终以零开始。假设基址为2000 arr[i] = *(arr+i)。现在if i= 0,这意味着*(2000+0)等于基地址或数组中第一个元素的地址。该索引被视为偏移量,因此bydeafault索引从零开始。
我有 Java 背景。我在下图中给出了这个问题的答案,我已经写在一张纸上,这是不言自明的
主要步骤:
注意:图中显示的块是内存表示
这是因为address必须指向element数组的右侧。让我们假设以下数组:
let arr = [10, 20, 40, 60];
Run Code Online (Sandbox Code Playgroud)
现在让我们考虑地址的开始和be12的大小。element4 bytes
address of arr[0] = 12 + (0 * 4) => 12
address of arr[1] = 12 + (1 * 4) => 16
address of arr[2] = 12 + (2 * 4) => 20
address of arr[3] = 12 + (3 * 4) => 24
Run Code Online (Sandbox Code Playgroud)
如果不是, zero-based从技术上讲,我们的第一个元素地址将array是16错误的,因为它的位置是12。