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的地址请告诉我我错过了什么!!
答案 0 :(得分:6)
&p
获取p
的地址,而不是p
的值。那对你来说&p + 1 == a
纯属巧合,取决于你的堆栈对齐。您的编译器可能已将这两个变量按另一个顺序排序,或者在两者之间留一个间隙。
答案 1 :(得分:3)
这很有趣。写下正好什么&amp; p + 1表示。它与数组中的任何地址无关。它印刷的是纯粹的巧合。
添加另一个数组b。然后设置p = b并打印&amp; p + 1和&amp; b [0]。也许你弄明白会发生什么。
答案 2 :(得分:3)
数组不是指针不是数组。
&p
是p
的地址,而不是它包含的地址(即其值),它是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 $
观察警告,顺便说一下。