- 下面的标识符表明什么含义?
int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); int* (*(*p4)(int*))(int*); int (*(*p5)(int*))[5];
左右法则数组
- 从最里层的圆括号中未定义的标识符看起
- 首先往右看,再往左看
- 遇到圆括号或方括号时,能够肯定部分类型,并调转方向
- 重读 2,3 步骤,直到阅读结束
int (*p)(int);
函数
1. (*p) ==> p 是一个指针 2. (*p)(int) ==> p 是一个函数指针 3. int (*p)(int) ==> p 是一个函数指针,函数类型为 int(int)
int (*p1)(int*, int (*f)(int*))
指针
1. (*p1) ==> p1 是一个指针 2. (*p1)(int*, int (*f)(int*)) ==> p1 是一个函数指针 3. int (*p1)(int*, int (*f)(int*)) ==> p1 是一个函数指针,函数类型为 int(int*, int (*f)(int*))
int (*p2[5])(int*)
code
1. p2[5] ==> p2是一个包含5个元素的数组 2. (*p2[5]) ==> p2是一个包含5个指针元素的指针数组 3. (*p2[5])(int*) ==> p2是一个包含5个函数指针元素的函数指针数组 4. int (*p2[5])(int*) ==> p2是一个包含5个函数指针元素的函数指针数组,函数类型为 int(int*)
int (*(*p3)[5])(int*)
编译器
1. (*p3) ==> p3 是一个指针 2. (*p3)[5] ==> p3 是一个数组指针,指向的数组包含5个元素 3. (*(*p3)[5]) ==> p3 是一个数组指针,指向的数组包含5个元素,元素类型为指针 4. (*(*p3)[5])(int*) ==> p3 是一个数组指针,指向的数组包含5个元素,元素类型为函数指针 5. int (*(*p3)[5])(int*) ==> p3 是一个数组指针,指向的数组包含5个元素,元素类型为函数指针,函数类型为 int(int*)
int* (*(*p4)(int*))(int*)
编译
1. (*p4) ==> p4 是一个指针 2. (*p4)(int*) ==> p4 是一个函数指针 3. (*(*p4)(int*)) ==> p4 是一个函数指针,包含一个 int* 参数,函数返回值为指针 4. (*(*p4)(int*))(int*) ==> p4 是一个函数指针,函数包含一个 int* 参数,函数返回值为函数指针 5. int* (*(*p4)(int*))(int*) ==> p4 是一个函数指针,函数包含一个 int* 参数,函数返回值为函数指针,函数类型为 int(int*)
int (*(*p5)(int*))[5]
变量
1. (*p5) ==> p5 是一个指针 2. (*p5)(int*) ==> p5 是一个函数指针 3. (*(*p5)(int*)) ==> p5 是一个函数指针,函数包含一个 int* 参数,返回一个指针 5. (*(*p5)(int*))[5] ==> p5 是一个函数指针,函数包含一个 int* 参数,返回一个指向5个元素的数组指针 6. int (*(*p5)(int*))[5] ==> p5 是一个函数指针,函数包含一个 int* 参数,返回一个数组指针, 数组类型为 int[5]
- 左右法则总结于编译器对指针变量的解析过程
- 指针阅读练习的意义在于理解指针的组合定义
- 能够经过 typedef 简化复杂指针的定义,以提升程序的可读性
int* (*(*p4)(int*))(int*) ==> typedef int(Func1Type)(int*); typedef Func1Type*(Func2Type)(int*); Func2Type p4;
int (*(*p5)(int*))[5] ==> typedef int(ArrayType)[5]; typedef ArrayType* (FuncType)(int*); FuncType* p5;
以上内容参考狄泰软件学院系列课程,请你们保护原创!软件