C标准6.5.3.2地址和间接运算符(3)表示:
"一元&运算符返回其操作数的地址。如果操作数具有类型''type'',则结果具有类型''指向类型''的指针。如果操作数是一元*运算符的结果,则该运算符和&运算符都不是。运算符被计算,结果就像两个都被省略一样,除了对运算符的约束仍然适用且结果不是左值。"
" 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;
}
会给:
name: Pf
name: A2_f
所以它们不一样。
有什么问题?我有什么误解?非常感谢你的帮助, 感谢。
答案 0 :(得分:9)
这些不一样。
&*A
为A
数组中的第一个元素提供了衰落指针float*
的地址,A
是一个特定的数组类型,如float A[2]
所示。 {1}}。
答案 1 :(得分:5)
πάντα ῥεῖ's回答解释了当&*A
是数组时,A
和A
与简单情况不同的原因。
但更一般地说,由于C ++允许operator*
和operator&
的重载,这两者可能会大不相同。对于像std::unique_ptr<int> p
这样的智能指针,&*p
是int*
,它甚至与p
的类型不同。
答案 2 :(得分:4)
如果是typeid
不执行左值到右值,数组到指针或函数到指针的转换。
因此,&*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