将 *array 分配给指针
Posted
技术标签:
【中文标题】将 *array 分配给指针【英文标题】:Assigning *&array to a pointer 【发布时间】: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]
decays 到 int *
。
【参考方案1】:
引用C11
,第 §6.5.3.2 章,地址和间接运算符,
一元
*
运算符表示间接。 [....] 如果操作数的类型为 ‘‘pointer to type’’,则结果的类型为 ‘‘type’’。 [....]
所以,对于p = *&a;
,
&a
是指向“int
s 数组”的指针。
*&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;是的,最终结果将是相同的。以上是关于将 *array 分配给指针的主要内容,如果未能解决你的问题,请参考以下文章