将 *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] decaysint * 【参考方案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;是的,最终结果将是相同的。

以上是关于将 *array 分配给指针的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 的内存操作函数: 给数组指针分配内存

将指针值分配给另一个指针值。我做错了吗?

将结构成员指针分配给另一个动态内存分配的指针是不是安全?

为啥不能将父指针分配给子指针?

将指针分配给指针(并将指针传递给类)时使用删除的 C++ 混淆

为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?