typedef使用大全3(指向函数的指针)
typedef使用大全3(指向函数的指针)
%A
%A 在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗?
%A
%A int (*s_calc_func(char op))(int, int);
%A
%A 如果不知道,请看下面的程序,里面有比较详细的说明
%A
%A
%A // 定义四个函数
%A int add(int, int);
%A int sub(int, int);
%A int mul(int, int);
%A int div(int, int);
%A
%A // 定义指向这类函数的指针
%A typedef int (*FP_CALC)(int, int);
%A
%A // 我先不介绍,大家能看懂下一行的内容吗?
%A int (*s_calc_func(char op))(int, int);
%A
%A // 下一行的内容与上一行完全相同,
%A // 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针
%A FP_CALC calc_func(char op);
%A
%A // 根据 op 返回相应的计算结果值
%A int calc(int a, int b, char op);
%A
%A int add(int a, int b)
%A {
%A return a + b;
%A }
%A int sub(int a, int b)
%A {
%A return a - b;
%A }
%A int mul(int a, int b)
%A {
%A return a * b;
%A }
%A int div(int a, int b)
%A {
%A return b? a/b : -1;
%A }
%A
%A // 这个函数的用途与下一个函数作业和调用方式的完全相同,
%A // 参数为op,而不是最后的两个整形
%A int (*s_calc_func(char op)) (int, int)
%A {
%A return calc_func(op);
%A }
%A
%A FP_CALC calc_func(char op)
%A {
%A switch (op)
%A {
%A case ‘+‘: return add;
%A case ‘-‘: return sub;
%A case ‘*‘: return mul;
%A case ‘/‘: return div;
%A default:
%A return NULL;
%A }
%A return NULL;
%A }
%A
%A int calc(int a, int b, char op)
%A {
%A FP_CALC fp = calc_func(op); // 下面是类似的直接定义指向函数指针变量
%A // 下面这行是不用typedef,来实现指向函数的指针的例子,麻烦!
%A int (*s_fp)(int, int) = s_calc_func(op);
%A // ASSERT(fp == s_fp); // 可以断言这俩是相等的
%A if (fp) return fp(a, b);
%A else return -1;
%A }
%A
%A void test_fun()
%A {
%A int a = 100, b = 20;
%A printf("calc(%d, %d, %c) = %d\n", a, b, ‘+‘, calc(a, b, ‘+‘));
%A printf("calc(%d, %d, %c) = %d\n", a, b, ‘-‘, calc(a, b, ‘-‘));
%A printf("calc(%d, %d, %c) = %d\n", a, b, ‘*‘, calc(a, b, ‘*‘));
%A printf("calc(%d, %d, %c) = %d\n", a, b, ‘/‘, calc(a, b, ‘/‘));
%A }
%A
%A 运行结果
%A calc(100, 20, +) = 120
%A calc(100, 20, -) = 80
%A calc(100, 20, *) = 2000
%A calc(100, 20, /) = 5
%A
%A
%A
%A%A
%A
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
首届国际 IC 电子商务信用论坛暨 TBF 世界会员交流会深圳站视频
五笔输入法在单片机系统中的应用
Tornado2.2编译问题求救
初学者电源教程:第三部分——线性稳压电源
400W逆变器电路
[Android开发视频教学]Android平台一日游(01)
技创发布专业版ARM与DSP仿真器
音频处理芯片msp34x0g
三星着眼于2027年代工厂盈利 期望市场份额为 20%
一款手机充电器电路
Connext Drive 4.0 将AI添加到SDV通信中
TechInsights 拆解:Meta Quest 3S
AMD 推出锐龙 5 7500X3D 处理器,限定北美与 EMEA 区域发售
MAX11200 微功耗(<1mW)、24位ADC
镍镉蓄电池用6v(12v)/2A自动充电装置
[分享]洛克菲洛转
到2030年,全球FPGA市场有望达到193.4亿美元
具有优良充电曲线和自动断路的12v/6A充电电路
人工智能模型的增长超过了硬件的改进
S3C44B0用Tornado设断点调试设备重启是为何?
高通骁龙8 Gen 5芯片核心信息曝光:与骁龙8 Elite Gen 5一体双生
學習式遙控器IC FD59C08
TechInsights 拆解:Eve Energy 插座和功率计
低噪声、高电压 DC/DC 转换器
快速蓄电池充电装置
稳流ic 7135
[转贴]关于日本车
TechInsights 拆解:现代 Ioniq 5 仪表盘
义隆IC 湿度检测IC电流反馈放大IC
[Android开发视频教学]搭建Android开发环境(02)