【问题标题】:Assigning *&array to a pointer将 *array 分配给指针
【发布时间】:2017-02-02 06:21:31
【问题描述】:

以下摘录来自Harbinson, Steele C: A Reference Manual (5th Edition)。根据本书,p 的两个分配是等价的。

7.5.6 地址运算符

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

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

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

为什么分配p = *&a 正确?

【问题讨论】:

  • 我不明白混淆在哪里——如果&a是指向int数组的指针,那么*&a是int的数组,它是指向int的类型指针,这是p的类型。
  • 请不要在问题正文中添加发布链接。无论如何,任何好的答案都会引用/引用引用。
  • 一元*是一元&的逆,所以*&a == a,因此如果p = a是合法的(它是合法的),那么p = *&a也是合法的。
  • "a是指向int的指针类型",没有a是一个数组,即int[10]类型。
  • @reproduktor: *&a确实是int的数组,但是它的类型是int[10],而不是“指向int的指针”。稍后在此上下文中键入 int[10] decaysint *

标签: c arrays pointers assignment-operator


【解决方案1】:

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

一元* 运算符表示间接。 [....] 如果操作数的类型为 ‘‘pointer to type’’,则结果的类型为 ‘‘type’’。 [....]

所以,对于p = *&a;

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

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

引用C11,第 6.3.2.1 章

除非它是 sizeof 运算符、_Alignof 运算符或 一元 & 运算符,或者是用于初始化数组的字符串文字,该表达式具有 type ''array of type'' 被转换成一个类型为 ''pointer to type'' 的表达式,它指向 到数组对象的初始元素并且不是左值。 [...]

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

【讨论】:

  • @Roland 好吧,官方文档不是免费的提示:请使用 n1570 进行谷歌搜索,希望对您有所帮助 :)
【解决方案2】:

*& 组合在一起时,它不会被评估。 p = *&a; 等同于 p = a;*& 相互抵消。

【讨论】:

  • 先生,我知道&*会发生这种情况,*&也一样吗? §6.5.3.2/p3
  • @SouravGhosh;是的,最终结果将是相同的。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多