程序:
#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.为什么?
答案 0 :(得分:62)
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 link:Why is arr and &arr the same?
答案 1 :(得分:26)
在案例4中,您获得0x100 + sizeof x
而sizeof x
为4 * sizeof int
= 4 * 4 = 16 = 0x10。
(在您的系统上,sizeof int
为4)。
答案 2 :(得分:9)
评估这个问题的简单方法是:
增量上的任何指针都指向基本类型的下一个内存位置。
&amp; x的基本类型是 int(* p)[4] ,它是指向4个整数数组的指针。
因此,此类型的下一个指针将指向原始数组的16个字节(假设int为4个字节)。
答案 3 :(得分:3)
即使x
和&x
评估为相同的指针值,它们也是不同的类型。衰减到指针后的x
类型为int*
,而&x
的类型为int (*)[4]
。
sizeof(x)
是sizeof(int)*4
。
因此&x
和&x + 1
之间的数字差异为sizeof(int)*4
。
使用2D阵列可以更好地可视化。假设你有:
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
之间的差异。
答案 4 :(得分:-6)
信不信由你,程序的行为未定义!
&x + 1
实际上是指向数组之外的 ,正如@ i486的回答巧妙地指出的那样。你不拥有那段记忆。即使尝试为其指定指针也是未定义的行为,更不用说尝试取消引用了。