让我们从您的程序中删除不必要的杂物,并修复它以正确打印指针(如hacks建议的那样):
int a[]={3,5,6,10,2};
int *p;
printf("%p\n", (void*)&p);
printf("%p\n", (void*)&a);
我猜它在您的系统上的行为方式相同(我不能确定;这种东西是依赖于实现的)。
编译器(或操作系统)按顺序(降序或升序 - 这可能不同)将地址分配给局部变量。似乎您的系统为源代码中前面声明的变量提供了更大的地址。
地址的不同是每个变量的大小(以字节为单位)。
您可以像这样可视化变量的存储:
+------+
| p | (address 0x7fff759edd88)
| p | (... continued at address 0x7fff759edd8c)
+------+
| a[0] | (address 0x7fff759edd90)
| a[1] | (address 0x7fff759edd94)
| a[2] | (address 0x7fff759edd98)
| a[3] | (address 0x7fff759edd9c)
| a[4] | (address 0x7fff759edda0)
+------+
请注意,您的原始程序p
以一种相当迂回的方式打印地址(首先将其分配给q
,然后打印q
)。