新闻  |   论坛  |   博客  |   在线研讨会
typedef使用大全3(指向函数的指针)
yanqin | 2009-04-16 16:39:21    阅读:1179   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客