为什么数组第一个索引以0开头
答案 0 :(得分:5)
因为index实际上是指指针的偏移量。第一个元素的偏移量为0。
评论时更新好吧,我会试试。
让我们考虑一个包含10个元素的字节数组:
byte array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
考虑这个数组所在的存储单元(假设它从地址0010h开始):
0010 0011 0012 0013 0014 0015 0016 0017 0018 0019
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
我们的变量array
指向0010h
。
1
(第一个元素)的偏移量为0
,其实际地址为0010 + 0
(其中0010
是array
的地址,{ {1}}是偏移量。
0
(第三个元素)的偏移量为3
,因为它位于第三个单元格中,单元格大小为2
(因为我们有字节数组)。第3个元素的实际地址是1
。
回到我们的编程语言:0010 + 2
表示具有array[0]
地址的内存单元格的内容,0010
表示具有array[1]
的内存单元格的内容地址(第二个元素)等等。 C中的0010 + 1
指的是第一个元素*array
- 到第二个元素。
答案 1 :(得分:2)
同样的理由是数学头脑的人明天“从现在起一天”而不是“从现在开始的两天”。
答案 2 :(得分:1)
因为指针算术更容易这样。
在 C 中,您可以将数组视为指针。这样,如果你有这个数组:
char a[50];
char *ptr = a;
使用指针算术,你可以通过向它添加整数来移动指针:
*(ptr + 0); // first character in the array
*(ptr + 1); // second character in the array
// so on, so forth
答案 3 :(得分:0)
因为元素0与数组的开头之间的距离为0。它是第一个元素,但它位于第0位,就像第一世纪没有超过100年的那样。
答案 4 :(得分:0)
首先也是最重要的:因为标准/你的编译器这么说。 其次,因为指针算术。如果你有一个数组A,那么A + 0是第一个元素,A + 1秒,依此类推。这是数组在内存中的表示方式。
答案 5 :(得分:0)
第一个索引始终以零开头,因为编译器使用索引值来计算数组中元素的实际地址。
请考虑以下示例。
void someFunction()
{
int exampleArray[5] = {0, 1, 2, 3, 4};
}
“exampleArray”,需要空间来存储5个元素,每个元素都需要存储数据类型“int”所需的空间量。根据平台(16位/ 32位或64位)和OS,“int”数据类型的大小可能不同。对于我们的讨论,假设“int”的大小是4个字节。
因此,要将上述数组存储在内存中,我们需要5个整数的内存= 5 * 4 = 20个字节。 现在,此数组中的每个元素都有一个“地址”。
让我们说“exampleArray”存储在地址100。 那么索引“i”处的元素的地址将是100 +(i * sizeof(int))。所以对于上面的数组,
Index 0, address = 100 + (0 * 4) = 100
Index 1, address = 100 + (1 * 4) = 104
Index 2, address = 100 + (2 * 4) = 108
Index 3, address = 100 + (3 * 4) = 112
and so on..
这是编译器生成用于访问数组索引的代码的方式。 所以当我们编写exampleArray [2]时,计算机需要能够计算出地址 索引2处的元素,以便能够访问其内存位置,从而访问其值。 因此,根据上述公式,索引“2”处的元素将是100 +(2 * 4)= 108。
由于数组中的第一个元素必须位于地址100,因此其索引变为0,以便以简单的方式计算其地址。