我是C语言的初学者,目前正在玩指针以进行理解。以下代码创建了一个包含10个元素的数组,我尝试通过使用此处的指针输出第一个和第二个数组元素的地址:
#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;
}
编译后,得到以下输出:
元素[0] = 0,地址= 195ab640
元素[1] = 1,地址为195ab644
因此,第一数组元素array [0]和第二数组元素array [1]的地址为195ab640和195ab644。连续的数组元素地址号之间总是存在4个差异。
我期望如果第一个数组元素的地址为m,则下一个元素地址为m + 1,但是我遇到了m + 4。为什么地址增加了四个而不是一个?
我使用以下在线编译器:https://www.onlinegdb.com/online_c_compiler
答案 0 :(得分:4)
(尽管这些都不符合C标准的复杂法律规范,但我认为对于当今使用的每种体系结构都是如此。)
指针指向内存中的某个位置,在现代计算机中,内存的基本可寻址单位是字节。 int
通常为4个字节-您可以使用sizeof(int)
在系统上确定其大小。 (至少对于x86,x86-64和ARM都是这样。不过,对于可移植性和样式,始终使用sizeof
。)
当您有一个int
数组时,根据您的情况,前4个字节对应一个整数。接下来的四个字节类似,依此类推。要在较低级别递增指针以引用数组中的下一个 ,计算机必须向前移动4个字节,以提供您所看到的行为。
(其他类型具有其他大小;您可以在C中使用sizeof(long)
,sizeof(float)
等来查看它们。)
答案 1 :(得分:0)
在大多数系统上,整数的大小为4个字节。编译器会根据数据类型自动推断增量的大小,在您的情况下为int。