以下摘录来自Harbinson, Steele C: A Reference Manual (5th Edition)。根据这本书,p
的两个作业是等价的。
7.5.6地址运营商
int a[10], *p;
p = a; p = *&a;
然而,根据C faq Question 6.12 a
是指向int
的类型指针,而&a
是指向int
数组的指针类型。< / p>
所以我们应该在第二个赋值p = *&a
中得到一个类型错误,因为我们试图将一个int
数组赋给一个指针。
为什么作业p = *&a
正确?
答案 0 :(得分:3)
引用C11
,章节§6.5.3.2,地址和间接操作符,
一元
*
运算符表示间接。 [....]如果操作数具有类型为''的类型''指针,则结果类型为''type''。 [....]
所以,对于p = *&a;
,
&a
是指向“int
s”数组的指针。*&a
是一种数组类型。现在,当在RHS中使用赋值时,数组类型衰减到指向数组的第一个元素的指针int *
。
引用C11
,章节§6.3.2.1
除非它是sizeof运算符,
_Alignof
运算符或者运算符的操作数 一元&
运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]
因此,没有报告任何警告/错误。
答案 1 :(得分:1)
当*&
聚集在一起时,它不会被评估。 p = *&a;
与p = a;
等效。 *
和&
抵消了彼此的影响。