C++ 11代码:

int a[3];
auto b = a;       // b is of type int*
auto c = &a;      // c is of type int(*)[1]

C代码:
int a[3];
int *b = a;
int (*c)[3] = &a;
bc的值相同。
bc有什么区别?为什么它们不是同一类型?

更新:我将数组大小从1更改为3。

最佳答案

sizeof运算符的行为应该有所不同,尤其是当您将a的声明更改为不同数量的整数,例如int a[7]时:

int main()
{
    int a[7];

    auto b = a;
    auto c = &a;

    std::cout << sizeof(*b) << std::endl;  // outputs sizeof(int)
    std::cout << sizeof(*c) << std::endl;  // outputs sizeof(int[7])

    return 0;
}

对我来说,这打印:
4
28

这是因为两个指针的类型非常不同。一个是指向整数的指针,另一个是指向由7个整数组成的数组的指针。

第二个确实具有指针数组类型。当然,如果取消引用它,在大多数情况下它将为decay to a pointer,但实际上它并不是指向int的指针。第一个是指向int的指针,因为衰减是在赋值时发生的。

如果您确实有两个指针数组类型的变量,并试图将一个分配给另一个变量,它将显示在其他地方:
int main()
{
    int a[7];
    int b[9];

    auto aa = &a;
    auto bb = &b;

    aa = bb;

    return 0;
}

这为我赢得了错误消息:
xx.cpp: In function ‘int main()’:
xx.cpp:14:8: error: cannot convert ‘int (*)[9]’ to ‘int (*)[7]’ in assignment
     aa = bb;

但是,此示例有效,因为取消引用bb使其可以衰减为指向int的指针:
int main()
{
    int a;
    int b[9];

    auto aa = &a;
    auto bb = &b;

    aa = *bb;

    return 0;
}

请注意,衰减不会发生在作业的左侧。这不起作用:
int main()
{
    int a[7];
    int b[9];

    auto aa = &a;
    auto bb = &b;

    *aa = *bb;

    return 0;
}

它为您赢得:
xx2.cpp: In function ‘int main()’:
xx2.cpp:14:9: error: incompatible types in assignment of ‘int [9]’ to ‘int [7]’
     *aa = *bb;

关于c++ - C和C++ : What is the difference between pointer-to and address-of array?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20454712/

10-11 15:11