专栏中心

EEPW首页 > 专栏 > typedef使用大全3(指向函数的指针)

typedef使用大全3(指向函数的指针)

发布人:yanqin 时间:2009-04-16 来源:工程师 发布文章
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 世界会员交流会深圳站视频

五笔输入法在单片机系统中的应用

初学者电源教程:第三部分——线性稳压电源

[Android开发视频教学]Android平台一日游(01)

视频 2010-10-29

音频处理芯片msp34x0g

三星着眼于2027年代工厂盈利 期望市场份额为 20%

EDA/PCB 2025-11-13

Connext Drive 4.0 将AI添加到SDV通信中

TechInsights 拆解:Meta Quest 3S

AMD 推出锐龙 5 7500X3D 处理器,限定北美与 EMEA 区域发售

MAX11200 微功耗(<1mW)、24位ADC

视频 2010-10-28

到2030年,全球FPGA市场有望达到193.4亿美元

嵌入式系统 2025-11-13

人工智能模型的增长超过了硬件的改进

高通骁龙8 Gen 5芯片核心信息曝光:与骁龙8 Elite Gen 5一体双生

學習式遙控器IC FD59C08

TechInsights 拆解:Eve Energy 插座和功率计

低噪声、高电压 DC/DC 转换器

视频 2010-10-22

稳流ic 7135

TechInsights 拆解:现代 Ioniq 5 仪表盘

义隆IC 湿度检测IC电流反馈放大IC

[Android开发视频教学]搭建Android开发环境(02)

视频 2010-10-29
更多 培训课堂
更多 焦点
更多 视频

技术专区