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

时间:2016-02-29 18:59:40

标签: c++ arrays dereference

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

所以它们不一样。

有什么问题?我有什么误解?非常感谢你的帮助, 感谢。

3 个答案:

答案 0 :(得分:9)

这些不一样。

&*AA数组中的第一个元素提供了衰落指针float*的地址,A是一个特定的数组类型,如float A[2]所示。 {1}}。

答案 1 :(得分:5)

πάντα ῥεῖ's回答解释了当&*A是数组时,AA与简单情况不同的原因。

但更一般地说,由于C ++允许operator*operator&的重载,这两者可能会大不相同。对于像std::unique_ptr<int> p这样的智能指针,&*pint*,它甚至与p的类型不同。

答案 2 :(得分:4)

如果是typeid

  

不执行左值到右值,数组到指针或函数到指针的转换。

因此,&*AA在这种情况下并不相同。 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