为什么%d指向数组的指针给出了数组的第一个元素?

WDr*_*rgn 3 c arrays pointers

有人可以向我解释为什么这段代码总是返回数组的第一个元素?(本例中为7):

int a[] = {7,1,3};
printf("%d", *a);
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 11

首先,让我告诉你,有没有指针数组这里,你已经是一个数组变量,适用于它引用操作.

阵列,(许多其它病例中)作为的操作数使用时*操作员,衰减到的指针数组的第一元素.所以

 printf("%d", *a);
Run Code Online (Sandbox Code Playgroud)

是相同的

 printf("%d", *(&(a[0]));
Run Code Online (Sandbox Code Playgroud)

之后,根据printf()要求,

  • 你有一个%d转换说明符
  • 你有一个类型的参数 int

因此,它可以正确打印该值.


注意:

引用C11,章节§6.3.2.1,左值,数组和函数指示符,(强调我的)

除非它是运算sizeof符,_Alignof运算符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则将类型为''数组'的数组的表达式转换为类型为''的表达式指向类型''的指针指向数组对象的初始元素,而不是左值.[...]


Som*_*ude 10

它不是"%d"为您提供第一个元素的格式,它是与数组一起使用时的解引用运算符.

数组自然地衰减到指向第一个元素的指针,当你取消引用指针时,你得到它指向的值.