有关函数指针有趣的代码


都说指针是C语言的灵魂,确实如此,今天在学习C语言过程中就发现了两个非常有趣的代码,给大家分享一下,关于函数指针的那些套娃过程。


一、上代码

(*(void(*)())0)();//代码1
void(*signal(int,void(*)(int)))(int);//代码2

二、代码一

刚开始看确实是无从下手,奇奇怪怪的,但是如果我们把它分解成下面两个部分再看

void(*)();//1
//剩余部分
(*(       )0)();//2

很明显,1是函数指针的类型;而2呢是把0强制转换为()内部的类型,也就是强制转换为函数指针类型,然后再转换后的函数指针解引用当做函数操作。
值得注意的是,这里1的函数指针类型中无输入参数,故外面解引用后的函数指针当做函数使用时后面也没有参数,需要与之对应。

二、代码二

signal(int,void(*)(int));//1
void(*            )(int);//2
//另外一种理解,3写法是错误的,帮助理解
void(*)(int)  signal(int,void(*)(int));//3

显然,1是一个函数,其中有两个参数,参数1是int类型的,而参数2却是函数指针类型,函数的函数名是signal。
这样就不难理解2就是函数指针,也是signal函数的返回值。
如果看3的话就会发现它其实是函数的声明,signal是函数名,后面是两个形参,前面的函数指针类型是返回值的类型。


三、合理运用类型定义

由上述代码3的启发,我们想着是否可以定义一个类型来避免这种复杂的表述

typedef void(*pfun)(int);
//可以理解为
typedef void(*)(int) pfun;//写法错误,理解

有了这样的类型定义,我们就可以把上述的冗长的声明改为

void(*signal(int,void(*)(int)))(int);//原
pfun signal(int,pfun);

四、总结

看似无用,但是会很有意思,当做爽文看看罢了,善于发现C语言的魅力才是重点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值