我第一次学习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
我还在学习中,但我也想了解和掌握这个组合声明,谁能给我一些方法和建议吗?
将类型名称转换为变量声明(即不要省略变量名称)时更容易理解。
例如
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 指针的数组”。