取数组地址时的不同指针的算术结果
程序:
#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。 衰减到指针后的x
types是int*
而&x
types是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的答案巧妙地指出。 你不拥有这个记忆。 即使试图为其指定一个指针也是未定义的行为,更不用说尝试对其进行解引用 。