c - 数组名称如何具有其地址以及其中的第一个元素?

标签 c pointers

<分区>

输出:

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 的地址相同。

&aa 具有相同的地址,因为使用 & 时,数组不会衰减为指针。因此,&a表示数组的地址,即第一个元素所在的地址。使用 &a,您不是获取指向第一个元素的指针的地址,而是获取数组的地址,因为 a 不是指向第一个元素的指针那种特殊情况。

编辑 正如其他答案中提到的,在转换为 void * 之后,您应该使用 %p 打印指针值:

printf("a=%p, &a=%p, *a=%d, &(*a)=%p\n",(void *) a, (void *) &a,*a,(void *) &(*a));

关于c - 数组名称如何具有其地址以及其中的第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19344162/

相关文章:

C 编程。为什么这不起作用?

c - 十进制到二进制函数中的段错误

c++ - 接口(interface)名称(eth0 等)的等效 inet_addr C/C++、Linux

检查用户输入的字符串在 C 中的格式是否为 "%d/%d/%d/%d/%d"

c - 以十六进制表示 Z/2 Z 中的多项式

c++ - 什么是数组到指针的衰减?

C: printf 中的ptrdiff_t 应使用哪个字符?

c++ - 通过指针

c - 如何修复此段错误?

c++ - 引用函数指针