C语言变量定义或声明中,如果比较复杂,让识别并读出其类型成为了一个困难的任务。例如:int *a[3], 到底是指针的数组,还是数组的指针。
使用下面的四个原则。
1. 由外及内:如果存在多级的括号,把最外层的括号看成整体,读完括号外面,再读括号里面。
2. 先前再后:对每一层,变量名或包含变量名的括号位于中间,类型符号放在前面和后面,先读前面的部分,再读后面的部分。
3. 从左向右:对每一部分,从左到右阅读出每个类型符号。
4. 忽略次要:在阅读时,为了便于理解,可以先忽略掉次要的信息:如数组的大小,函数的参数和返回值类型。
例子1
int *a[3];
只有一层,前面部分为 int *, 读作:’整数的指针’,后面部分为[3],读作‘数组’
所以a的类型为“整数的指针的数组”
注意:为了便于理解,在阅读时忽略数组的大小。
例子2
int * (*a)[3];
如下分解
层次 |
前面 |
后面 |
第一层 |
int * 整数的指针 |
[3] 数组 |
第二层 |
* 指针 |
(注:这部分为空,忽略) |
现在只要从上到下阅读表格中的每一行(每行从左到右读),:
“整数的指针的数组的指针”
为了便于理解,使用括号标出层次,“[ ( 整数的指针) 的数组 ] 的指针”—这是一个非常好用的一个方法,推荐使用。
例子3
int (*a[10])(int v);
如下分解
层次 |
前面 |
后面 |
第一层 |
int 整数 |
(int v) 参数为整形的函数 |
第二层 |
* 指针 |
[10] 数组 |
所以,a的类型为:
“[ (返回整数的,以一个整数为参数的函数) 的指针] 的数组”
为了便于理解,阅读时可以先忽略掉函数的返回值和类型信息,直接读为
“[ 函数的指针] 的数组”