第十二课

1,右左法则

右左法则用于解决如何辨识一个声明;
方法:1,首先从最里面的圆括号(应该是未定义的标识符)看起;
     2,然后往右看,再往左看。
     3,每当遇到右圆括号时,就应该调转阅读方向。
     4,一旦解析完圆括号里面所有的东西,就跳出圆括号。
     5,重复这一过程,直到整个声明解析完毕。

2,int(*p[5])(int *);

分析:
    1,在中间看到*p,明白是一个指针;
    2,向右,看见一个数组
    3,明白数组里存的是指针
    4,跳出中间的圆括号,
    5,向右,有参数列表,说明数组里面存的是函数指针
    6,向左,明白这是一个参数为int*,返回值为int的函数指针
清晰写法:
    typedef int(*pFun)(int*);
    pFun p[5];

3,int (*fun)(int * p,int (*pf)(int *));

清晰写法:
       typedef int (*PF)(int*);
       typedef int (*PFUN)(int*,PF pf);

4,int (*( * fun)[5])(int *p);

分析:
    1,fun是一个指针,二维数组指针
    2,指向的是一个存储函数指针的数组
清晰写法:(事例)
#include<stdio.h>
int a(int* p)
{
   
    printf("%d", *p);
}
typedef int(*PFUN)(int*);
int main()
{
   
    int n = 999;
    int* x = &n;
    PFUN p[][5] = {
    a };
    PFUN(*pa)[5] = p;
    pa[0][0](x);//输出999
    return 0;
}
    

5,int (*( *fun)(int *p))[5];

分析:
    1,fun是一个指针,函数指针
    2,函数的返回值是一个指向数组的指针
    3,数组的每个元素都是int
清晰写法:
    typedef int(*PARR)[5];
    typedef PARR(*PFUN)(int*);
事例:
    #include<stdio.h>
    int arr[][5]={
   999};
    PARR reArr(int* p)
    {
   
        return arr;
    }
    int main()
    {
   
        PARR parr=reArr(NULL);
        printf("%d",parr[0][0]);//输出999
        return 0;
    }

6,int( * ( *pfun() ) ( ) ) ( );

分析:
    1,pfun是一个函数,不是指针,外面都是它的返回值
    2,返回的是指针,返回的是函数指针
    3,返回的函数指针的返回值,又是一个函数指针
清晰写法:
    typedef int (*PFUNt)();//外层
    typedef PFUNt (*PFUNm)();//内层
事例:
    #include<stdio.h>
    int a1()
{
   
    printf("1");
}
PFUNt a2()
{
   
    printf("2");
    return a1;
}
PFUNm a3()
{
   
    printf("3");
    return a2;
}
int main()
{
   
    a3();
    printf(" ");
    a3()();
    printf(" ");
    a3()()();输出3 32 321
    return 0;
}