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

时间:2015-11-18 09:05:26

标签: c pointers language-lawyer

程序:

#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.为什么?

5 个答案:

答案 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 xsizeof 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
|               |
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+

如您所见,ptrptr+1之间的差异为sizeof(int)*4。该类比适用于代码中&x&x + 1之间的差异。

答案 4 :(得分:-6)

信不信由你,程序的行为未定义

&x + 1实际上是指向数组之外的 ,正如@ i486的回答巧妙地指出的那样。你不拥有那段记忆。即使尝试为其指定指针也是未定义的行为,更不用说尝试取消引用了。