与c语言中的数组索引相关的问题

时间:2010-12-04 18:43:08

标签: c windows

为什么数组第一个索引以0开头

6 个答案:

答案 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(其中0010array的地址,{ {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,以便以简单的方式计算其地址。