取数组地址时的不同指针的算术结果

程序:

#include<stdio.h> int main(void) { int x[4]; printf("%p\n", x); printf("%p\n", x + 1); printf("%p\n", &x); printf("%p\n", &x + 1); } 

输出:

 $ ./a.out 0xbff93510 0xbff93514 0xbff93510 0xbff93520 $ 

我期望以下是上述程序的输出。 例如:

 x // 0x100 x+1 // 0x104 Because x is an integer array &x // 0x100 Address of array &x+1 // 0x104 

但是最后一个陈述的结果与我预期的不一样。 &x也是数组的地址。 因此,递增1将打印地址递增4.但是&x+1给出地址递增10.为什么?

 x -> Points to the first element of the array. &x ->Points to the entire array. 

偶然发现了一个描述性的解释: http : //arjunsreedharan.org/post/69303442896/the-difference-between-arr-and-arr-how-to-find

SO链接: 为什么arr和arr是一样的?

在情况4你得到0x100 + sizeof xsizeof x是4 * sizeof int = 4 * 4 = 16 = 0x10。

(在你的系统上, sizeof int是4)。

一个简单的thumbrule来评估这是:

增量上的任何指针指向其基本types的下一个内存位置。

&x的基本types是int(* p)[4] ,它是一个指向4个整数数组的指针

所以这个types的下一个指针将指向原始数组的16个字节(假设int为4个字节)。

即使x&x评估为相同的指针值,它们也是不同的types。 衰减到指针后的xtypes是int*&xtypes是int (*)[4]

sizeof(x)sizeof(int)*4

因此, &x&x + 1之间的数值差异是sizeof(int)*4

它可以更好地使用二维数组可视化。 假设你有:

 int array[2][4]; 

array的内存布局是:

 array | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ array[0] array[1] | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ 

如果你使用一个指向这样一个数组的指针,

 int (*ptr)[4] = array; 

并通过指针来查看内存,它看起来像:

 ptr ptr+1 | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ 

正如你所看到的, ptrptr+1之间的差别是sizeof(int)*4 。 这个比喻适用于代码中&x&x + 1之间的区别。

相信与否,你的程序的行为是不确定的

&x + 1实际上是指向arrays之外,因为@ i486的答案巧妙地指出。 你不拥有这个记忆。 即使试图为其指定一个指针也是未定义的行为,更不用说尝试对其进行解引用