如何确定一个变量的类型
1.如果一个变量声明中没有括号
如果一个变量声明中没有括号,从右往左读,离变量名最近的修饰符确定这个变量的类型。如果最近的修饰符是指针或引用,那么除了这个修饰符,其余部分(也从右往左读)确定这个指针(引用)指向什么类型。
int a; //整数类型
int *p;//从右往左读,第一个修饰符是*,说明p是指针,剩下的修饰符只有int,那么就是指向int的指针
int **p;//同理解释
如何声明一个数组的指针?注意,数组和指针并不等价,所以数组的指针不是二级指针。
int arr[10];
int *parr[10] = &arr; //对吗?
我们从右往左读,第一个遇到的修饰符是[10]
,说明啥?说明parr
是一个数组,剩下还有int*
,那就说明,parr
是int*
的数组。所以上述代码会报错。既然从右往左读,那么下边的代码怎么样?
int[10] *parr = &arr;
理论上来讲,这确实是一个数组的指针(从右往左读)。但不幸的是,C/C++语法并不允许这样。那还有没有办法?
2.变量声明中有括号
变量声明中有括号,优先括号内从右往左读,其余的和没有括号的情况一样。
int (*parr)[10] = &arr;//正确
先读括号内,parr
是个指针,剩下的修饰符还有int[10]
(从右往左读),那么parr
就是指向int[10]
的指针。ohhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!!!!!!!!!!!!!!
3.检测一下(逐渐变态···
请问下边的p和pp是什么类型?
int *(*p)[4];
int (*(*p))[2][3];
首先看括号,确定p
是一个指针。剩下的从右向左读int*[4]
,这是一个数组,数组中的每个元素都是int*
,所以,p
是一个指针,指向一个int*
数组。
再看下一个,好像有点变态······
先看最里边的括号,p
是一个指针,再看外边的括号,除去(*p)
,外边括号里就剩下*
,所以p
是指向指针(命名为t
)的指针。那么t
指向哪里?看剩下的int[2][3]
,结果很清楚了。p->t->二维数组
.
4.总结
总体从右向左看,有括号先看括号里,离变量名最近的修饰符确定了变量的类型。
完。
ps:建议结合我这篇文章看《C++ const与指针》,更加酸爽!