C++:&*A对于数组声明不等同于A?

use*_*758 2 c++ arrays dereference

C标准6.5.3.2地址和间接运算符(3)表示:

"一元&运算符返回其操作数的地址.如果操作数的类型''类型'',结果的类型''指向类型''.如果操作数是一元*运算符的结果,那么运算符都不是也没有对&运算符进行求值,结果就好像两个都被省略了,除了对运算符的约束仍然适用,结果不是左值."


"83)因此,&*E等于E(即使E是空指针),&(E1 [E2])到((E1)+(E2)).如果E是a,则总是如此函数指示符或作为一元&运算符的有效操作数的左值,*&E是函数指示符或等于E的左值.如果*P是左值并且T是对象指针类型的名称,*(T) P是一个左值,其类型与T指向的类型相符."

所以,如果我理解得好,&*E就好像我们会删除一样&*.然而,

#include <cstdio>
#include <typeinfo>

int main()
{
    float A[2];
    printf( "name: %s\n", typeid( &*A ).name());
    printf( "name: %s\n", typeid( A ).name());
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

会给:

name: Pf
name: A2_f
Run Code Online (Sandbox Code Playgroud)

所以他们不一样.

怎么了?我有什么误会?非常感谢你的帮助,谢谢.

πάν*_*ῥεῖ 9

这些都不一样.

&*A给出了A数组中第一个元素的地址作为衰减指针float*,并且A是一个声明的特定数组类型float A[2].


Bar*_*rry 5

πάνταῥεῖ的答案解释了为什么&*A并且AA数组时的简单情况有所不同.

但更一般地说,由于C++允许重载,operator*并且operator&两者可能大不相同.对于类似的智能指针std::unique_ptr<int> p,&*p是一个int*,甚至不是与其相同的类型p.