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

突破•指针四

听说这是目录哦

  • 函数指针数组🫧
    • 用途:转移表
  • 回调函数🫧
  • 能量站😚

函数指针数组🫧

函数指针数组是存放函数地址的数组,例如int (*parr[5])()parr先和[]结合,说明parr是可以存放5个函数地址【元素】的数组,每个元素都是int (*)()类型的函数指针。
关于函数指针的知识可以参考:突破•指针三

用途:转移表

可以简化代码。
例子:计算器的一般实现。
化简前:

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;do{printf("*************************\n");printf(" 1:add             2:sub \n");printf(" 3:mul             4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("输入操作数:");//重复语句scanf("%d %d", &x, &y);//重复语句ret = add(x, y);printf("ret = %d\n", ret);//重复语句break;case 2:printf("输入操作数:");scanf("%d %d", &x, &y);ret = sub(x, y);printf("ret = %d\n", ret);break;case 3:printf("输入操作数:");scanf("%d %d", &x, &y);ret = mul(x, y);printf("ret = %d\n", ret);break;case 4:printf("输入操作数:");scanf("%d %d", &x, &y);ret = div(x, y);printf("ret = %d\n", ret);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

化简后:

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;//特地在最前面加一个NULL,让输入的选项与数组下标对应int(*p[5])(int x, int y) = { NULL, add, sub, mul, div }; //转移表do{printf("*************************\n");printf(" 1:add             2:sub \n");printf(" 3:mul             4:div \n");printf(" 0:exit\n");printf("*************************\n");printf("请选择:");scanf("%d", &input);if ((input <= 4 && input >= 1)){printf("输入操作数:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);printf("ret = %d\n", ret);}else if (input == 0){printf("退出计算器\n");}else{printf("输入有误\n");}} while (input);return 0;
}

回调函数🫧

回调函数就是一个通过函数指针调用的函数。
(俄罗斯套娃,被套着的那个娃就是回调函数。)
例如下述代码中函数void calc(int(*pf)(int, int))的形参是函数指针,用来接收回调函数addsub muldiv的地址。

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}void calc(int(*pf)(int, int))
{int ret = 0;int x, y;printf("输入操作数:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("ret = %d\n", ret);
}int main()
{int x, y;int input = 1;int ret = 0;do{printf("*************************\n");printf(" 1:add             2:sub \n");printf(" 3:mul             4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(add);//使用回调函数的理念break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

能量站😚

在大多数领域,天赋被高估了,时间长了,决心就是你的天赋。
请添加图片描述
❤️❤️❤️ 恭喜! 恭喜! 闯关成功! ❤️❤️❤️

http://www.lryc.cn/news/410516.html

相关文章:

  • 深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
  • day1 服务端与消息编码
  • 部署WMS仓储管理系统项目后的注意事项
  • 跨网段 IP 地址通信故障分析
  • 存储引擎MySQL和InnoDB(数据库管理与高可用)
  • 探索局域网传输新境界 | 闪电藤 v2.2.7
  • Tiling Window Management
  • 9. kubernetes资源——pv/pvc持久卷
  • 2024西安铁一中集训DAY27 ---- 模拟赛((bfs,dp) + 整体二分 + 线段树合并 + (扫描线 + 线段树))
  • STM32F401VET6 PROTEUS8 ILI9341 驱动显示及仿真
  • 抖音视频素材网站有哪些?非常好用的5个抖音视频素材库分享
  • 【数据结构】链式二叉树的实现和思路分析及二叉树OJ
  • 项目成功秘诀:工单管理系统如何加速进程
  • OpenGauss和GaussDB有何不同
  • 星环科技携手东华软件推出一表通报送联合解决方案
  • YOLOv10环境搭建、训练自己的目标检测数据集、实际验证和测试
  • Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。
  • 甄选范文“论数据分片技术及其应用”软考高级论文,系统架构设计师论文
  • 【elementui】记录el-table设置左、右列固定时,加大滚动条宽度至使滚动条部分被固定列遮挡的解决方法
  • Python人工智能:一、语音合成和语音识别
  • C/C++进阶 (8)哈希表(STL)
  • 2024电赛H题参考方案(+视频演示+核心控制代码)——自动行驶小车
  • 设计模式14-享元模式
  • Javascript中canvas与svg详解
  • 【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’
  • Flink SQL 的工作机制
  • [AI Mem0] 源码解读,带你了解 Mem0 的实现
  • 【LLM】-10-部署llama-3-chinese-8b-instruct-v3 大模型
  • C语言 之 理解指针(4)
  • Java设计模式—单例模式(Singleton Pattern)