输出:
a=1606416992, &a=1606416992,
*a=1, &(*a)=1606416992
程序:
#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));
}
我知道数组名是指向数组第一个元素的指针。
但我怀疑指针应该存储在某个地方并且它应该有一个地址位置。
如果是这样,如何在位置“1606416992”存储元素“1”并且相同的“1606416992”是指向数组的指针的地址位置?
请帮助澄清。
当在表达式中使用时,数组名称会衰减为指向第一个元素的指针。但是,此规则有 3 个异常(exception):
- 数组作为
sizeof();
的操作数出现
- 数组的地址是用
&
运算符获取的;
- 该数组是一个字符串或宽字符串文字初始值设定项。
在您的代码中,a
和 &(*a
) 是同一件事,因为 *a
等同于 a[0]
,因此,&(*a)
与 a
的地址相同。
&a
与 a
具有相同的地址,因为使用 &
时,数组不会衰减为指针。因此,&a
表示数组的地址,即第一个元素所在的地址。使用 &a
,您不是获取指向第一个元素的指针的地址,而是获取数组的地址,因为 a
不是指向第一个元素的指针那种特殊情况。
编辑
正如其他答案中提到的,在转换为 void *
之后,您应该使用 %p
打印指针值:
printf("a=%p, &a=%p, *a=%d, &(*a)=%p\n",(void *) a, (void *) &a,*a,(void *) &(*a));