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

C++ C++;:&*A不等同于for数组声明?,c++,arrays,dereference,C++,Arrays,Dereference,C标准6.5.3.2地址和间接运算符(3)规定: “一元&运算符返回其操作数的地址。如果操作数的类型为“类型”,则结果的类型为“指向类型的指针”。如果操作数是一元*运算符的结果,则不会对该运算符和&运算符求值,并且结果就像两者都被省略一样,但运算符上的约束仍然适用,且结果不是左值。” “83)因此,&*E相当于E(即使E是空指针),并且&(E1[E2])相当于((E1)+(E2))。如果E是一个函数指示符或一元运算符的有效操作数的左值,*&E是一个函数指示符或等于E的左值。如果*P是左值,T是

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

“一元&运算符返回其操作数的地址。如果操作数的类型为“类型”,则结果的类型为“指向类型的指针”。如果操作数是一元*运算符的结果,则不会对该运算符和&运算符求值,并且结果就像两者都被省略一样,但运算符上的约束仍然适用,且结果不是左值。”


“83)因此,&*E相当于E(即使E是空指针),并且&(E1[E2])相当于((E1)+(E2))。如果E是一个函数指示符或一元运算符的有效操作数的左值,*&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;
}
所以他们不一样

怎么了?我误解了什么?我很感激你的帮助, 谢谢。

这些不一样

&*A
A
数组中第一个元素的地址作为衰减指针
float*
,并且
A
是一种特殊的数组类型,在

未执行Lvalue到rvalue、数组到指针或指针转换函数

因此,
&*A
A
在这种情况下是不同的。
A
不会衰减为指向其在
typeid(A).name()中的第一个元素的指针

使用
sizeof
运算符可以看到相同的行为

int main()
{
    float A[10];
    printf( "name: %zu\n", sizeof( &*A )); // &*A --> float * type
    printf( "name: %zu\n", sizeof( A ));   // A   --> float[10] type
    getchar();
    return 0;
}
输出:

name: 8
name: 40
答案解释了当
A
是一个数组时,为什么
&*A
A
在简单情况下是不同的


<>但更一般的是,由于C++允许重载<代码>操作符*>代码>和>代码>运算符和<代码>,这两种方法可能会有很大的不同。对于一个智能指针,如“代码> STD::UnQuyJPPTP/CODE >,<代码>和*P<代码>是一个<代码> int */COD>,它甚至不接近于与代码> P<代码>相同的类型。NS不会改变表达式的行为。所以引文可能过时了?因为C没有Type,这里没有兼容性问题。请理解C++和C是不同标准的不同语言。目前的问题根本没有意义,因为它被标记为C++,包含了对T的引用。在C++标准中搜索“*”:如果你想把问题更新为C,而不是C++,这将以同样的方式说明问题。谢谢你的帮助:
name: 8
name: 40