将*&数组分配给指针
以下摘录来自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;
。 *
和&
抵消彼此的影响。