将*&数组分配给指针

时间:2016-09-24 13:30:37

标签: c arrays pointers assignment-operator

以下摘录来自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正确?

2 个答案:

答案 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;等效。 *&抵消了彼此的影响。