C++ 星号和括号的关系对多维数组的定义有什么影响

问题描述 投票:0回答:1

我第一次学习C++是通过这本书C++ Primer。我发现很难掌握声明指针和数组类型的语法。

这从第三章开始,介绍了多维数组的类型别名。出于个人兴趣,我尝试声明数组和指针的组合,但后来我感到困惑。

我已经学会了如何声明数组指针和指针数组,当

*
被圈起来时,表示指向数组的指针,否则表示指针数组,如bottom:

    std::cout << typeid(int[3][3][3]).name() << std::endl;      // A3_A3_A3_i
    std::cout << typeid(int *[3][3][3]).name() << std::endl;    // A3_A3_A3_Pi
    std::cout << typeid(int (*)[3][3][3]).name() << std::endl;  // PA3_A3_A3_i

然后我尝试添加一些圆圈和星号,但我完全不知道如何区分它们。

    std::cout << typeid(int ((*)[3])[3][3]).name() << std::endl;    // PA3_A3_A3_i
    std::cout << typeid(int ((*)[3][3])[3]).name() << std::endl;    // PA3_A3_A3_i

    std::cout << typeid(int *(*[3][3])[3]).name() << std::endl;       // A3_A3_PA3_Pi
    std::cout << typeid(int *((*[3])[3])[3]).name() << std::endl;     // A3_PA3_A3_Pi
    std::cout << typeid(int *(*)[3][3][3]).name() << std::endl;       // PA3_A3_A3_Pi
    std::cout << typeid(int *(*(*)[3][3])[3]).name() << std::endl;    // PA3_PA3_A3_Pi
    std::cout << typeid(int (*(*(*[3])[3])[3])).name() << std::endl;  // A3_PA3_PA3_Pi

我还在学习中,但我也想了解和掌握这个组合声明,谁能给我一些方法和建议吗?

c++ arrays pointers
1个回答
0
投票

将类型名称转换为变量声明(即不要省略变量名称)时更容易理解。

例如

int *(*(*)[3][3])[3]
->
int *(*(*foo)[3][3])[3]
。该名称应该只有一个地方是合法的,因此不可能将其添加到错误的位置。

然后按运算符优先级决定的顺序应用

[N]
*
。在这种情况下,他们不是运营商,但规则是故意相似的。 (
[N]
的优先级高于
*
,并且通常所有后缀的优先级都高于前缀)。

此优先级强制按以下顺序解析各部分:

int *(*(*foo)[3][3])[3]
    6 4 1     2  3   5

因此,“指向 3 个数组的指针,该数组的 3 个指针指向 3 个 int 指针的数组”。

© www.soinside.com 2019 - 2024. All rights reserved.