将 *&array 分配给指针

Assigning *&array to a pointer

以下摘录自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 = *&a 中得到一个类型错误,因为我们试图将 int 的数组赋给一个指针。

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

引用 C11,章节 §6.5.3.2,地址和间接运算符

The unary * operator denotes indirection. [....] If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. [....]

因此,对于 p = *&a;

  • &a 是指向 "array of ints".
  • 的指针
  • *&a是数组类型。

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

引用 C11,章节 §6.3.2.1

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. [...]

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

*& 在一起时,则不会对其进行评估。 p = *&a; 等同于 p = a;*& 相互抵消效果。