news 2026/9/6 3:00:22

函数指针相关知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
函数指针相关知识

zhangyunxin411 2026.9.5

1. 什么是函数指针

  1. 函数指针实际上就是一种指针,指向的是函数,比如:
    int(*p)(int,int);// 表示指针p指向一个参数为(int, int),返回值为int的函数
  2. 函数指针怎么用,函数指针就是一种指针类型,要使用同样需要声明和定义:
    intfun(inta,intb){...}int(*p)(int,int);p=fun;
  3. 利用 typedef 对函数指针起别名,顺便归纳一下 typedef 的写法:总体上就是声明一个该类的对象,然后将变量名改为要起的别名就行:
    // 比如要给一般的变量、指针变量起别名inta;// 声明typedefintI;// 别名Iint*p;// 声明typedefint*POINT;// 别名POINTstructdata{inti;charc;}stu;// 声明typedefstructdata{inti;charc;}DATA;// 别名DATAint*array[10];// 指针数组typedefint*ARRAY[10];int(*array)[10];// 数组指针typedefint(*POINT)[10];
    那么同样的函数指针也能这么写,在之后的操作中,会发现这么写很方便:
    typedefint(*FUN)(int,int);

接下来总结函数指针的主要用途:作为参数、作为返回值;

2. 函数指针作为参数

函数作为参数很常见,比如各种回调函数。只需要将一个函数指针作为参数传入,回调函数就可以调用不同的函数,比如:

voidfun1(){...}voidfun2(){...}voidcall_fun(void(*p)()){p();}call_fun(fun1);call_fun(fun2);``` #3.函数指针作为返回值 为什么要执行一个函数再让这个函数返回一个函数呢,有什么意义:主要意义有两个:1.可以根据输入参数/状态,动态决定要执行哪一个函数。当然你也可以用if-else实现,但是当状态/参数多的时候,代码会变得冗长;2.在面向对象编程中,有的函数被封装,此时通常会通过这种方法来,通过一个外部的函数接口来调用内部的私有方法; 对于1,给出下面的一个命令分发器的例子: ```c// -----命令对应的函数-----voidled_on(){printf("LED ON!");}voidled_off(){printf("LED OFF!");}voidmotor_run(){printf("MOTOR RUN!");}typedefvoid(*FUN)(void);#defineCMD_NUM3// -----两个用于维护的数组-----char*cmd_name[CMD_NUM]={"led on","led off","motor run"};FUN cmd_handel[CMD_NUM]={led_on,led_off,motor_run};// -----命令分发器代码-----FUNcmd_search(char*str){FUN p=NULL;inti=0;for(i=0;i<CMD_NUM;i++){if(strcmp(str,cmd_name[i])==0){p=cmd_handel[i];returnp;}}returnp;}intmain(){charstr[10];fgets(str,10,stdin);str[strcspn(str,"\n")]='\0';FUN p=cmd_search(str);if(p!=NULL)p();return0;}``` 在上面的例子中,命令分发器逻辑不需要修改,当增删命令时只需要修改两个数组即可;甚至数组和处理函数可以变成配置数据,程序启动时动态加载,实现在不重启系统的情况下,动态增删命令。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 2:58:30

Transformer统治AI后,我却在数据漂移上栽了——基础课还能救命吗

Transformer统治AI后,我却在数据漂移上栽了--基础课还能救命吗 为什么我以为深度学习基础课已经过时了 2025 年我转方向做推荐系统时,身边几乎所有人都在谈大模型、Agent、RAG,技术分享会上提到「深度学习入门」这个词甚至会有人笑--都什么年代了还从反向传播开始学?我当时也…

作者头像 李华
网站建设 2026/9/6 2:56:25

深度拆解RTOS任务调度:从就绪表到上下文切换的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 2:55:06

软件开发团队知识沉淀:从重复踩坑到高效问题解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 2:55:05

参半牙膏用户评价怎么样?复购率高电商平台好评率90%以上

据弗若斯特沙利文调研及小阔集团招股书披露&#xff0c;参半在主要电商平台抖音的老客户月度零售额贡献占比高达43%&#xff0c;显著跑赢个护品类25%至35%的行业均值&#xff0c;品牌知名度在受调研口腔护理集团中位居第一&#xff0c;全网综合好评率稳定在90%以上。依托与德国…

作者头像 李华
网站建设 2026/9/6 2:50:59

RDMA中CQ为什么用轮询?——从CQ、Doorbell到GID的深度解析

RDMA中CQ为什么用轮询&#xff1f;——从CQ、Doorbell到GID的深度解析 在使用RDMA进行高性能通信开发时&#xff0c;很多开发者都会遇到一些底层机制上的疑问&#xff1a;为什么CQ要用轮询而不是硬件主动通知&#xff1f;Doorbell到底写到哪里&#xff1f;GID表里的0号GID能不能…

作者头像 李华