前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言中的函数指针(*(void(*)())0)();

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

作者头像
HeaiKun
发布2020-07-06 16:26:14
1.7K0
发布2020-07-06 16:26:14
举报
文章被收录于专栏:HeaiKunHeaiKun

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

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

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

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

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

  1. 什么是函数指针变量?
  2. 怎么通过函数指针变量调用函数?
  3. 函数指针变量是怎么定义的?

第一个问题:我们知道一个函数形式是 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陷阱与缺陷》,感兴趣的同学可以读一读

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HeaiKun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档