数组名如何包含其地址以及其中的第一个元素?

Abi*_*bin 1 c pointers

输出:

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"是指向数组的指针的地址位置?

请帮忙澄清一下.

Fil*_*ves 5

在表达式中使用时,数组名称会衰减为指向第一个元素的指针.但是,此规则有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)