4

笔试中的问题

  • 下面的标识符代表什么含义?
int (*p1)(int*, int (*f)(int*));

int (*p2[5])(int*);

int (*(*p3)[5])(int*);

int* (*(*p4)(int*))(int*);

int (*(*p5)(int*))[5];

指针阅读技巧

  • 左右法则

    1. 从最里层的圆括号中未定义的标识符看起
    2. 首先往右看,再往左看
    3. 遇到圆括号或方括号时,可以确定部分类型,并调转方向
    • 重读 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;

以上内容参考狄泰软件学院系列课程,请大家保护原创!


TianSong
737 声望139 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧