笔试中的问题
- 下面的标识符代表什么含义?
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*)
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;
以上内容参考狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。