为什么& p + 1给出与p相同的结果

时间:2015-12-10 15:48:03

标签: c

Path=.

该代码将作为示例打印

    #include <stdio.h>
    int main(void)
    {
        int a[]= {15, 14, 34, 46, 69, 86, 10, 0, 4};
        int *p = a; // p point to the first element of array a[0]
        printf("%x\n%x\n",&p+1, &a[0]);
        return 0;
    }

so&amp; p + 1返回数组第一个元素的地址。 据我所知,&amp; p返回指针的地址,&amp; p + 1应该打印指针+ 1的地址请告诉我我错过了什么!!

4 个答案:

答案 0 :(得分:6)

&p获取p的地址,而不是p的值。那对你来说&p + 1 == a纯属巧合,取决于你的堆栈对齐。您的编译器可能已将这两个变量按另一个顺序排序,或者在两者之间留一个间隙。

答案 1 :(得分:3)

这很有趣。写下正好什么&amp; p + 1表示。它与数组中的任何地址无关。它印刷的是纯粹的巧合。

添加另一个数组b。然后设置p = b并打印&amp; p + 1和&amp; b [0]。也许你弄明白会发生什么。

答案 2 :(得分:3)

数组不是指针不是数组。

&pp的地址,而不是它包含的地址(即其值),它是p(FYI:它指向的对象的值是{ {1}})。同样,*p是数组中第一个元素的地址。数组位于下一个地址位置(&a[0])纯属巧合。

此外,指针的正确&p +1转换指定符为printf,并且它需要%p(您需要在此处进行转换,因为这是一个可变参数函数)。使用不同的说明符会调用未定义的行为。

您应该启用编译器警告。现代编译器会警告void *(和printf)格式字符串和参数之间类型的基本不匹配。

答案 3 :(得分:-3)

检查您是否正在运行您认为自己的样子。我只是尝试过它,它起作用了。

bash $ cc -o foo foo.c
foo.c:6:23: warning: format specifies type 'unsigned int' but the argument has type
      'int **' [-Wformat]
    printf("%x\n%x\n",&p+1, &a[0]);
            ~~        ^~~~
foo.c:6:29: warning: format specifies type 'unsigned int' but the argument has type
      'int *' [-Wformat]
    printf("%x\n%x\n",&p+1, &a[0]);
                ~~          ^~~~~
2 warnings generated.
bash $ ./foo
58af0888
58af0890
bash $ 

观察警告,顺便说一下。