将*&数组分配给指针

以下摘录来自Harbinson,Steele C:A Reference Manual(第5版) 。 根据这本书, p的两个任务是等价的。

7.5.6地址运营商

 int a[10], *p; p = a; p = *&a; 

然而,根据C faq Question 6.12, a是指向int的类型指针,而&a是指向int数组的类型指针。

所以我们应该在第二个赋值p = *&a得到一个类型错误,因为我们试图将一个int数组赋给一个指针。

为什么赋值p = *&a正确的?

引用C11 ,章节§6.5.3.2, 地址和间接操作符

一元*运算符表示间接。 [….]如果操作数的类型为”指向类型” ,则结果的类型为”type” 。 [….]

所以,对于p = *&a;

  • &a是指向“ int的数组”的指针。
  • *&a是一种数组类型。

现在,当在赋值的RHS中使用时,数组类型衰减到指向数组的第一个元素的指针,即int *

引用C11 ,章节§6.3.2.1

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

因此,没有报告警告/错误。

*&汇集在一起​​时,它不会被评估。 p = *&a;p = a;相等p = a;*&抵消彼此的影响。