0

我是 C 语言的初学者,目前正在使用指针来理解。下面的代码创建了一个包含十个元素的数组,我尝试在这里使用指针输出第一个和第二个数组元素的地址:

#include <stdio.h>

int main()
{
   int array[10]; 
   int i;

   for ( i = 0; i < 10; i++ ) {
      array[ i ] = i; 
   }

   int *ptr = &array[0];
   int *ptr2 = &array[1];

   printf("Element[%d] = %d  at Address = %x\n", 0, *ptr, ptr);
   printf("Element[%d] = %d  at Address = %x\n", 1, *ptr2, ptr2);

  return 0;
}

编译后,我得到以下输出:

Element[0] = 0  at Address = 195ab640
Element[1] = 1  at Address = 195ab644

所以第一个数组元素array[0]和第二个数组元素的地址array[1]195ab640195ab644。连续的数组元素地址编号之间总是有 4 个差异。

我期待如果第一个数组元素的地址是 m 下一个元素地址将是 m+1 但我遇到了m+4. 为什么地址增加了四而不是一?

我使用这个在线编译器:https ://www.onlinegdb.com/online_c_compiler

4

2 回答 2

4

(虽然这些都不符合 C 标准的复杂法律术语,但我相信对于当今使用的几乎所有架构来说都是如此。)

指针指向内存中的一个位置,在现代计算机中,内存的基本可寻址单元是字节。Anint通常为 4 个字节 - 您可以在系统上使用sizeof(int). (至少对于 x86、x86-64 和 ARM 来说是这样。不过,sizeof为了便携性和风格,始终使用它。)

当您有一个 s 数组时int,前 4 个字节(如您的情况)对应于一个整数。接下来的四个字节也是如此,依此类推。要增加指针以引用数组中的下一个整数,在低级别,机器必须向前移动 4 个字节,给出您看到的行为。

(其他类型有其他大小;您可以在 C 中使用sizeof(long)、等查看它们sizeof(float)。)

于 2019-07-14T19:27:59.610 回答
0

大多数系统上整数的大小是 4 个字节。您的编译器会根据数据类型自动推断增量的大小,在您的情况下是 int。

于 2019-07-20T05:48:55.850 回答