右左法则:
1)从最里层圆括号中未定义的标识符看起
2)首先往右看,再往左看
3)遇到圆括号或方括号时可以确定部分类型,并调转方向
4)重复2,3步骤直到阅读结束
下面是一些例子
int (*p1)(int*, int (*f)(int*));
int (*p2[5])(int*);
int (*(*p3)[5])(int*);
int*(*(*p4)(int*))(int*);
int (*(*p5)(int*))[5];
int (*p1)(int*, int (*f)(int*));
--> p1为指针,指向函数,函数的参数为int*和一个名字为f,参数为int*的函数指针,返回值为int
int (*p2[5])(int*);
--> p2为数组,有5个元素,数组元素为指针,指针指向函数,函数类型为 int(int*)
int (*(*p3)[5])(int*);
--> p3为指针,指向数组,数组内有5个元素,数组元素为指针,指针指向函数,函数类型为 int(int*)
int*(*(*p4)(int*))(int*);
--> p4为指针,指向函数,函数的参数为int*,返回值为指针,指针指向函数,函数类型为 int*(int*)
int (*(*p5)(int*))[5];
--> p5为指针,指向函数,函数的参数为int*,返回值为指针,指针指向数组,数组类型为int[5]
在实际工程中,我们需要使用typedef关键字,对这些定义进行简化,更容易读懂。使用typedef进行简化的步骤,实际上就是右左法则的倒述。
p1的简化:
typedef int (FuncType1)(int *);
typedef int (FuncType2)(int*,Functype1* f);
FuncType2* p1;
p2的简化:
typedef int(FuncType)(int*);
typedef FuncType* (ArrayType)[5];
ArrayType p2; //指针数组
p3的简化:
typedef int(FuncType)(int*);
typedef FuncType* (ArrayType)[5];
ArrayType *p3; //数组指针
p4的简化:
typedef int* (FuncType1)(int*);
typedef FuncType1* (FuncType2)(int*);
FuncType2* p4;
p5的简化:
typedef int(ArrayType)[5];
typedef ArrayType * (FuncType)(int*);
FuncType* p5;