左右法则
右左法则:首先从最里面的圆括号内未定义的标识符开始阅读看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
总之对声明进行分析,最根本的方法还是按优先级和结合性来类比替换,从那些最基本的声明进行类比,简化,从而进行理解。下面分析几个例子,来具体阐述如何使用这种方法。
简单:
int a; 这里从变量看,向右看是分号,转向左,是int 所以
a是整形变量
int *a; 从变量开始,先向右看,是分号,然后向左看,这里有一个
*,说明变量a是一个指针,然后继续向左,是int所以a是一
个整形指针变量
int **a; 这里还是从变量开始看,先向右看,是分号,然后向左看
是*,说明是指针变量,然后继续向左看,还是*,所以a是
指针的指针变量
int a[10]; 这里从变量看,先向右看,是[],说明a是数组
int *a[10]; 这里从变量看,先向右,是[],说明a是数组,然后向左
,可以看到是*,说明a是一个整形指针数组
int (*a)[10]; 从变量开始,先向右,是),说明a是一个变量
然后向左看,是*说明a是指针变量,然后继续向
右看,是【】,所以a是数组指针变量
int (*a)(int); 从变量开始看,先向右,是),说明a是变量,然后
向左看,是*,所以a是指针变量,然后向右,是
(),说明是个函数,所以a是一个函数指针变量,
指针指向一个函数,函数的形参是int, 返回值,是
int
int (*a[10])(int); 从变量开始看,先向右 看,是【】,说明a是
一个数组,继续向右,是),然后向左看,是
*,说明a是一个指针数组,继续向右看,是
(),说明这是函数指针数组,行参数int,返
回值是int
困难:
int *(*(*arr[5])())();
arr是一个函数指针数组,该数组的元素指向为函数,该函数的形参是空,返回值是函数指针,该指针指向是一个形参是空,返回值是int
float (*(*b())[])();
b是一个函数,该函数形参为空,返回值为数组指针,该指针指向一个函数指针数组,数组元素指向一个形参是空,返回值为float
void *(*c)(char a, int (*b)());
c是一个函数指针变量,指向一个形参字符变量a,和一个形参是函数指针变量,无返回值
float (*(*e【10】)(int *))[5]
e是一个函数指针数组,数组里的元素指向一个函数,该函数形参是int*,返回值为数组指针,指向的数组为float型数组