指针的阅读技巧

108 阅读1分钟

一.笔试中的问题

下面的标识符代表什么含义?

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步骤,知道阅读结束

编程实验:复杂指针的阅读 37-1.c

#include <stdio.h>
 
int main()
{ 
   
    int (*p1)(int*, int (*f)(int*));    
 //p1为指针,是函数指针,返回的类型为int,指向的类型为int*,inf(*f)(int*),f的类型也是函数指针,指向的函数参数为int*,返回值为int

    int (*p2[5])(int*);
    //p2为数组,有5个元素,元素类型为指针,指针参数类型为int*,返回值为int的函数
    int (*(*p3)[5])(int*);
  //p3为指针,数组指针,指向的数组有5个元素,5个元素为指针,是函数指针,指向的函数参数为int*,返回值为int
    int* (*(*p4)(int*))(int*);
    //p4是指针,函数指针,函数指针的返回值类型为指针,这个指针指向的函数类型为int*,返回值类型为int*
    int (*(*p5)(int*))[5];
  //p5的函数指针,函数指针的返回值是指针,指针有的数组类型为int[5]
    return 0;
}

三.小结:

  1. 右左法则总结于编译器对指针变量的解析过程

  2. 指针阅读练习的意义在于理解指针的组合定义

  3. 可通过typedef简化复杂指针的定义