c语言void f1,C语言中的函数指针(*(void(*)())0)();

‘’关注一下,一起学习!‘’

我刚开始学习C语言的时候是写简单的数学运算在黑框框里面跑,然后用C语言写51单片机的代码,再到后来玩stm32,学应用层编程,学内核编程等,框架结构逐渐变的复杂,也越来越觉得对C语言的理解还不够到位。真是越往下学,越觉得水深啊!个人总结一下C语言中有关函数的知识,如有问题请留言指明*v*

(*(void(*)())0)();

其实这个语句只有在微处理器最底层才有可能被调用,因为应用层几乎没有直接对一个地址进行操作的。

第一眼看上去都会脑袋一懵吧,其实我也不例外。但是你仔细分析一下就豁然开朗了。要想弄清楚这个语句,你得清楚三个问题。

什么是函数指针变量?

怎么通过函数指针变量调用函数?

函数指针变量是怎么定义的?

第一个问题:我们知道一个函数形式是  type  func(type...)  func就是一个函数的指针,我们假设一个指针变量funcp = &func;  那么funcp就是一个函数指针变量。

第二个问题:正常的函数调用直接使用func(...);就可以了。指针变量因为是一个指针所以要用到*取值,那么func就等价于*funcp。考虑到优先级的问题要加上(),所以通过函数指针变量来调用函数是(*funcp)(...);。

第三个问题:这个地方也是比较绕的地方,我们直接定义一个函数指针时要指明函数的返回值类型以及入参类型等,正常我们定义一个有一个int入参没有返回值的函数指针变量是 void (*funcp)(int);,定义一个整形变量是int a;。函数指针变量和整形变量相对比的话,void (*)(int) 就相当于int,而变量名funcp就和a等同了。

看到这里,再回头看看上面的(*(void(*)())0)();语句,你会发现(void(*)())0是将0强转成无返回值无入参的函数指针地址,外面一层就是取地址执行函数。就是将0地址作为函数的入口地址进行执行。仔细分析一下就能明白。

函数指针相关的知识点还是很重要的,在一些较大的项目中,我们经常会看到这样的语句 typedef  void (*HANDLER) (int);,这是定义一种函数指针类型,后面直接使用HANDLER就可以定义入参一个int无返回值的函数指针了。

C语言的函数指针非常重要,大工程里面经常出现各种回调函数,学习的过程中,基本功还是要扎实,不然真的会经常踏入陷阱。

ps:本文参考资料《C陷阱与缺陷》,感兴趣的同学可以读一读

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值