输出:
a=1606416992, &a=1606416992,
*a=1, &(*a)=1606416992
Run Code Online (Sandbox Code Playgroud)
程序:
#include "stdio.h"
main()
{
int a[4]={1,2,3,4};
printf("a=%u, &a=%u, *a=%d, &(*a)=%u\n",a,&a,*a,&(*a));
}
Run Code Online (Sandbox Code Playgroud)
我知道数组名称是指向数组第一个元素的指针.但我怀疑是指针应该存储在某个地方,它应该有一个地址位置.如果是这样,如何存储位置"1606416992"元素"1"并且相同的"1606416992"是指向数组的指针的地址位置?
请帮忙澄清一下.
在表达式中使用时,数组名称会衰减为指向第一个元素的指针.但是,此规则有3个例外:
sizeof();
&
运算符获取;在你的代码中,两者a
和&(*a
)是相同的东西,因为*a
它等同于a[0]
,因此,&(*a)
地址是相同的a
.
&a
具有与a
因为相同的地址&
,数组不会衰减成指针.因此,&a
表示数组的地址,即可以找到第一个元素的地址.有了&a
,你没有把指针的地址带到第一个元素,你正在获取数组的地址,因为a
在这种特殊情况下它不是指向第一个元素的指针.
编辑
如其他答案中所述,您应该%p
在转换为void *
:之后使用打印指针值:
printf("a=%p, &a=%p, *a=%d, &(*a)=%p\n",(void *) a, (void *) &a,*a,(void *) &(*a));
Run Code Online (Sandbox Code Playgroud)