在c/c++中有一些复杂的类型声明规则,例如:
int (*(*fun_one)(char *,double))[9][20]
int *p[]
int (*fpf())()
这些类型声明通常可以用typedef和using进行简化,然而当不进行简化的时候我们也应该能够理解这些声明的意义,本文介绍一下复杂声明解读的“右-左”法则。
step1:找出变量名
这里遵循一个规则一般很容易找到变量名,即“声明中不是关键字和数字的单词”(如果函数的参数给出了参数名称则需要甄别一下),例如
int (*(*fun_one)(char *,double))[9][20]
声明中int char double 都是关键字,因此变量名是fun_one
step2: 向右检索
从变量名开始向右检索,如果遇到"()",则变量为一个函数,可以暂时描述为 "variable是一个函数,返回值为xxxx"; 如果遇到"[]",则变量为一个数组,可以暂时描述为"variable是一个数组,数组成员为xxxxx"; 就这样一致向右检索直到结束或者遇到")"。 注意:如果遇到"("代表只是"()"的开始
step3:
向左遍历,如果遇到"*" 可以描述为”指针指向xxxx“;遇到"("后重复step2;遇到语句结束则整个分析结束
我们分析一下第一个声明
int (*(*fun_one)(char *,double))[9][20]
fun_one是一个指针,指针指向一个函数(参数为char*和double),返回值一个指针,指针指向[9]的数组,[9]数组的元素为[20]的数组,[20]数组中元素为int
该原则同样使用与const关键字,以下声明也可以用右左法则解释
const int a;
int const a;
const int * a;
int * const a;
const int * const a;