取数组地址时的不同指针的算术结果
程序:
#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 x和sizeof 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 | | +---+---+---+---+---+---+---+---+ | | | | | | | | | +---+---+---+---+---+---+---+---+ 
 正如你所看到的, ptr和ptr+1之间的差别是sizeof(int)*4 。 这个比喻适用于代码中&x和&x + 1之间的区别。 
相信与否,你的程序的行为是不确定的 !
  &x + 1实际上是指向arrays之外,因为@ i486的答案巧妙地指出。 你不拥有这个记忆。 即使试图为其指定一个指针也是未定义的行为,更不用说尝试对其进行解引用 。