C语言学习第十二课(复杂指针)

第十二课

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值