C++数组的指针、指针数组、指针数组的指针的声明有点绕,防止后面绕晕记不住所以记录下。
指针数组
int *ap[3];
为啥[3]要放在这里呢?[]优先级要高于*,所以[3]表明三个元素的数组,剩下的描述元素的类型,*表明数组元素为指针,int表明指针指向int类型。所以该声明为:具有3个指向int类型的指针的数组。
数组的指针
int (*pa)[3];
[3]表明为三个元素的数组,剩下的部分就是描述元素的类型。(*pi)是一个整体,表明是一个指针变量,变量名为pa。int表明元素为int类型。解释为:具有3个int类型元素的数组的指针。
指针数组的指针
int *(*pap)[3];
知道指针数组的声明*ap[3]
,那么替换ap变量为一个指针(*apa),代入进去为*(*apa)[3]
就是指针数组的指针了。
反过来,我们将上面的(*pap)
看成一个叫pa
的变量名为:int *pa[3];
它就是具有3个指向int类型的指针的数组,那么该数组的引用,就将pa
这个变量名变为一个指针变量,替换为*pap
然后代进去加上括号就是上面的声明了int *(*pap)[3];
:一个具有3个指向int类型的指针的数组的指针。
类型指针啥的太麻烦了,有点记不住,C++11版本新增的auto关键字可以省略类型的定义,让编译器来判定值的类型。
关于CLion编辑器本地变量定义小技巧
上面一堆指针啥类型啥的,太麻烦了。如果不适用auto关键字,想要自己显示的定义一个复杂的类型,比如"指针数组的指针类型"或者"函数指针数组的指针"的声明,还是比较费劲的。
CLion的自动创建本地变量的功能很有用。菜单:Main menu | Refactor | Extract | Introduce Variable...
可以生成本地变量。
使用快捷键的演示如下:
使用CLion的快速创建变量的功能,很方便的就根据右值创建了左边的符合的类型变量。
CLion设置里面keymap搜Introduce Variable可以看到你的快捷键。
代码
int a[3]; //3个int类型元素的数组
a[0]=1;
a[1]=2;
a[2]=3;
int (*pa)[3] = &a; //3个int类型元素的数组的指针
int *ap[3] = {&a[0], &a[1], &a[2]};//3个int类型元素的指针的数组
int *(*pap)[3] = ≈ //3个int类型元素的指针的数组的指针