当前位置: 首页 > news >正文

函数指针数组、回调机制

一、先搞懂:什么是函数指针?

函数指针 =指向函数的指针
它存的不是数据,是函数的地址

最简单的函数指针

// 普通函数intadd(inta,intb){returna+b;}// 定义一个函数指针int(*p)(int,int);// 让指针指向函数p=add;// 通过指针调用函数intres=p(10,20);// 等价 add(10,20)

二、函数指针数组(重点)

作用

多个同类型函数放进一个数组,用下标直接调用,适合:

  • 菜单选择
  • 命令处理
  • 状态机
  • 多任务调度

定义格式

返回值类型(*数组名[元素个数])(参数列表);

完整示例:菜单函数数组

#include<stdio.h>voidfunc1(){printf("执行功能1\n");}voidfunc2(){printf("执行功能2\n");}voidfunc3(){printf("执行功能3\n");}intmain(){// 函数指针数组:存3个无参无返回值函数void(*arr[3])()={func1,func2,func3};// 直接用下标调用!arr[0]();// 执行 func1arr[1]();// 执行 func2arr[2]();// 执行 func3return0;}

最常用场景:菜单选择

intchoose=1;arr[choose]();// 选1就调用1,选2就调用2

三、回调机制(进阶灵魂)

什么是回调函数?

把函数当参数传给另一个函数,在合适时机被调用 → 叫回调

一句话:
你定义的函数,别人(库/系统/框架)帮你调用 = 回调

作用

  • 解耦
  • 框架与业务分离
  • 事件触发
  • 中断处理、定时器、异步处理

最简单回调示例

#include<stdio.h>// 1. 回调函数(你写的)voidmyCallback(intval){printf("回调被调用!值 = %d\n",val);}// 2. 处理函数(框架/库),接收一个函数指针voidprocess(void(*cb)(int)){printf("开始处理...\n");cb(100);// 调用回调}intmain(){process(myCallback);// 把函数当参数传进去return0;}

运行结果

开始处理... 回调被调用!值 = 100

四、高级实战:函数指针数组 + 回调 合体

这是嵌入式、Linux、驱动最常用写法!

#include<stdio.h>// 回调函数类型typedefvoid(*Callback)(int);// 函数数组voidtask1(intid){printf("任务1执行,ID=%d\n",id);}voidtask2(intid){printf("任务2执行,ID=%d\n",id);}voidtask3(intid){printf("任务3执行,ID=%d\n",id);}// 回调调度中心(通用框架)voidrunTask(Callback cb,intid){cb(id);}intmain(){// 函数指针数组Callback tasks[]={task1,task2,task3};// 批量执行回调for(inti=0;i<3;i++){runTask(tasks[i],i+1);}return0;}

五、最精炼总结(面试/背诵专用)

函数指针数组

  • 把多个同类型函数放进数组
  • 下标快速调用
  • 适合菜单、命令、状态机

回调机制

  • 函数作为参数传递
  • 你定义,系统/框架调用
  • 实现解耦、事件驱动、模块化

一句话记牢

函数指针数组 = 函数列表;回调 = 把函数交给别人调用。

http://www.cnnetsun.cn/news/2777528.html

相关文章:

  • 【独家首发】全球首份《人机创造力配比健康指数》:你的AI依赖度已超标?3分钟自测+干预方案
  • ReadCat:如何在广告泛滥时代重新找回纯净阅读体验?
  • Sora 2科学可视化不是“视频生成”,而是新一代计算叙事引擎(附IEEE VIS 2024预印本验证数据)
  • 手术机器人+AI术中导航协同演进路线图(2024-2027临床转化时间表,含12家头部医企技术栈对比)
  • 亲测真香!2026年5款微软语音转文字免费神器,数据分析师10分钟搞定万字转写!
  • Tiny RDM终极指南:如何5分钟完成Redis可视化管理工具安装配置
  • 094、视频流实时检测管线:FFmpeg 拉流 + YOLO 推理 + Kafka 结果分发架构
  • Kubernetes DaemonSet — 企业级应用场景与实战实例【20260605】001篇
  • 利用快马AI快速构建汇川变频器控制逻辑模拟原型
  • 【Redis】Redis缓存应用实战Day12(2026年)
  • 美陈雕塑构思卡壳?5 个宝藏网站,帮你摆脱创作难题
  • 英语专业论文怎么降低重复率?
  • git status
  • 写mysql数据库日志的时机
  • 2026年实测10款降AI率网站推荐:免费与付费全对比,毕业论文降低ai率必看
  • 如何用LRCGET批量歌词同步工具一键解决离线音乐库歌词管理难题
  • 在Apple Silicon Mac上无缝运行Windows程序的完整指南:Whisky让你的Mac更强大
  • 目标检测调参实战:用CIOU Loss在YOLOv5/v8上提升mAP的完整流程
  • 如何在macOS上获得终极视频预览体验:QLVideo完整指南
  • 计算机小程序毕设实战-基于springboot+微信小程序的视频点播微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 突破JSXBIN加密壁垒:Jsxer如何成为Adobe脚本开发者的得力伙伴
  • 东南亚海外仓丢件到底谁责任?5步锁定丢在哪个环节
  • Python 爬虫监控告警:日志结构化 + 异常告警 + 采集速率实时监控落地
  • 为什么硬件工程师越来越多,高水平工程师却越来越难招?
  • 如何快速掌握炉石传说自动化脚本:终极完整指南
  • 极速启动:利用快马ai在五分钟内构建jdk17特性演示原型
  • 在 Oracle EBS 中,要在同一个 OU(运营单元)下实现不同交易走不同的公司段(Company Segment / Balancing Segment),核心思路是利用 SLA(子分类账会计)
  • Python入门到精通:零基础学习指南
  • Rust特征静态与动态分发在FFI内存管理中的i-cache性能对比
  • 离散味对称性在粒子物理模型中的应用与实现