C语言中函数指针详解

c语言中函数指针函数调用的方法有两种分别如下:
void fun(void){ //do something}int main(void){ ... fun(); ... return 0;}void fun(void){ //do something}int main(void){ ... void (*p)(void); p=fun; p(); return 0;}上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中。 那么我们就重点来分析下第二种方式。
第二种方式申明了一个函数指针p,那为啥写成void(p)(void)? 为啥不直接写成p,不是说了函数名就是该函数的入口地址,为啥不直接把该地址传给指针呢,这样既好理解又方便省事,其实这样想不无道理,但是在c语言中有变量类型这个东东,比如int赋值给char,编译器就会报错,同样的道理函数也有类型,那么既然函数有类型,我们如何知道变量类型呢。 现在写一个程序如下,注意,程序有错误,这个错误是故意写的,目的就是让编译器报错,使用编译器为gcc。
#include stdio.hvoid fun(void){ printf(hello world); }int main(void){ void *p; p=fun; return 0;}下面是编译器输出:
g++.exe -x c++ -c c:\\users\\administrator.sc-201903191934\\desktop\\unknown1.c -o c:\\users\\administrator.sc-201903191934\\desktop\\unknown1.o -wall -fallowive -wno-sign-compare -g
c:\\用户\\管理员.sc-201903191934\\桌面\\未知1.c:在函数中 int main()':** **c:\\users\\administrator.sc-201903191934\\desktop\\unknown1.c:12: warning: invalid conversion from 空 ( )()' 改为 '无效 '
编译器报错意思是不能讲void ( )()类型转化为void 类型。 这个警告就说明了函数fun的类型是( )()类型,而申明的指针类型是 ,两个类型不一致,故导致其错误,既然这样,那么如何申请一个指针类型为( )()的呢? c语言中给了函数指针这个类型,即( )()类型,因此为了让指针指向一个函数地址,只需要声明一个(*)()类型即可。
如下:
#include stdio.hvoid fun(void){ printf(hello world); } int main(void) {void (*p)(void); //函数指针 p=fun; return 0; }这样就将函数fun的地址给指针p了,与其说p是一个函数指针,倒不如说p是一个函数名,只是没有什么其函数内部,这里可以从旧式的函数申明上可以看出。
因此要运行这个所谓的函数p,只需要和函数使用一样就行,p();
现在再来看一个代码:
void *fun(void){ printf(hello world); return null;}这里函数fun改为了有返回值的函数,其返回值为指针void *类型,那么我们如何来声明一个指针指该函数呢?
从上门面分析可以看出,该函数的类型应该是*(*)(); 所以现在我们需要声明一个相同类型的指针,即void *(*p)(void); 这样就只需要p=fun; 就可以达到目的了。
#include stdio.hvoid *fun(void){ printf(hello world); return null;}int main(void){ void *(*p)(void); p=fun; return 0;}**总结:
函数名也是有类型的,因此在c语言中,必须严格遵守类型匹配原则。
函数名的类型为(*)()类型,如果有返回值,则在最前面增加返回类型即可,例如
int * fun(int,int ); 其函数类型为 ()(int,int),对应的函数指针为int **(*p)(int,int);

如何去构建自己的鸿蒙生态设备
无线耳机市占苹果保持第一,小米上升至第二
开放原子开源基金会发布《全球开源发展态势洞察》2023开放原子全球开源峰会特刊
三星慌了!传京东方有意收购LGD广州8.5代线
协作机器人实战案例 节卡机器人“智造之眼”解决安全效率难兼顾困扰
C语言中函数指针详解
苹果C94是什么 为何如此火爆
51单片机执行指令的过程的分析解释
电池安全问题让电动汽车遭受着毁灭性打击
中国移动正式公布2019年普通光缆产品集中采购中标候选人结果
阿里首家未来酒店开业 全程机器人服务
助听器的电池的使用
中芯国际与湖北省科技投资集团公司签订合资合同
英特尔推出第10代处理器中的所有8个都使用英特尔的14纳米工艺
华天慧创科技:获得4000万元融资,打造西安“硬实力”
基于51单片机设计的红外遥控器
市委书记李强调研华虹集团旗下上海集成电路研发中心
铁路运输安全技术及应用软件开发企业思维列控发布2022第一季度报告
云存储技术是如何影响商业世界的
向从未有人到过的星球发送信号时,会发生什么呢?