指针的右左法
右左法则(右左法则的英文原文翻译);首先从最里面的圆括号开始阅读,然后向右看,再往左看。每当遇到圆括号时,就应该调转阅读方向。一旦解析完圆括号里面所有东西,就跳出圆括号。重复整个过程直到整个声明解析完成。其实左右法则就是以标示符为中心点,自右向左旋转解读指针的声明含义。
例如:int (*a)[10]; 整型数组指针变量(首先看括号里面,a是一个指针变量,他存放的是数组元素的地址,而数组的每个元素都是整形)
int (*a[10])(int) 函数指针数组(首先a是一个数组,它的元素都是指针,指针指向一个形参为整形,返回值也为整形的函数)
下面来看几个复杂一点的指针声明
int *(*(*a)(int))[10](以a为中心,层层剥开括号,从右往左看)
a:函数指针变量,指向一个形参为整形,返回值为返回值数组指针,该指针指向一个整形指针数组。
阅读步骤:
1. 从变量名开始 -------------------------------------------- a
2. 往右看,什么也没有,碰到了),因此往左看,碰到一个* ------ 一个指针
3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数
4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针
5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组
6. 向左看,发现一个* --------------------------------------- 指针
7. 向左看,发现int ----------------------------------------- int类型
再来看一个例子:
int *( *( *arr[5])())();
arr:函数指针数组,该数组里的元素指向一个形参为空,返回值是一个函数指针,该指针指向一个形参为空,返回值为整形指针的函数
阅读步骤:
1. 从变量名开始 -------------------------------------------- arr
2. 往右看,发现是一个数组 ---------------------------------- 一个5元素的数组
3. 向左看,发现一个* --------------------------------------- 指针
4. 跳出括号,向右看,发现() -------------------------------- 不带参数的函数
5. 向左看,碰到* ------------------------------------------- (函数)返回一个指针
6. 跳出括号,向右发现() ------------------------------------ 不带参数的函数
7. 向左,发现* --------------------------------------------- (函数)返回一个指针
8. 继续向左,发现int --------------------------------------- int类型
float ( * ( *b()) [] )();
b是一个函数,该函数形参为空,返回值为数组指针,该数组指针指向一个函数指针数组,数组里的元素指向一个形参为空,返回值为浮点型;
阅读步骤:
1. 从变量名开始 -------------------------------------------- b
2. 往右看,发现是一个函数 ---------------------------------- 一个不带参数的函数
3. 向左看,发现一个* --------------------------------------- 指针
4. 跳出括号,向右看,发现数组-------------------------------- 元素个数未定的数组
5. 向左看,碰到* ------------------------------------------- 指针
6. 跳出括号,向右发现() ------------------------------------ 不带参数的函数
8. 继续向左,发现float --------------------------------------- float类型
void * ( *c) ( char a, int (*b)());
float ( * ( * e[10]) (int *) ) [5];
e是一个函数指针数组,该数组的元素指向一个形参为整形指针,返回值为数组指针,该指针指向f浮点型的数组;