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

为什么数组第一个索引从0开始

因为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的地址, 0是偏移量)。

3 (第三个元素)的偏移量为2因为它位于第三个单元格中,并且单元格大小为1 (因为我们有字节数组)。 第三个元素的实际地址是0010 + 2

回到我们的编程语言: array[0]表示具有0010地址的存储器单元的内容, array[1]表示具有0010 + 1地址(第二个元素)的存储器单元的内容,等等。 *array C中的*array指向第一个元素, *(array+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 

因为元素0距离数组的开头的距离为0。 这是第一个元素,但它在0位置,就像在第一个世纪没有超过100的年份。

首先也是最重要的:因为标准/你的编译器这样说。 其次,由于指针算术。 如果你有一个数组A,那么A + 0是第一个元素,A + 1秒,依此类推。 这是数组在内存中的表示方式。

第一个索引总是从零开始,因为编译器使用索引的值来计算数组中元素的实际地址。

考虑下面的例子。

 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,以便以简单的方式计算其地址。