typedef 函数指针的用法

 

在网上搜索函数指针,看到一个例子。开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它。其实很多时候都是这样,如果每次到难一点的内容,总想着下次我再来解决它,那就永远也学不到东西。

后面那个例子加了注释,是我对这种用法的理解,希望对新手有所帮助。

进入正文:

 代码简化, 促进跨平台开发的目的.

 typedef 行为有点像 #define 宏,用其实际类型替代同义字。

 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换

用法一:

typedef int (*MYFUN)(int, int)
这种用法一般用在给函数定义别名的时候
上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int

分析这种形式的定义的时候可以用下面的方法: 
先去掉typedef 和别名剩下的就是原变量的类型. 
去掉typedef和MYFUN以后就剩: 
int (*)(int, int)

用法二:

typedef给变量类型定义一个别名.

typedef struct{ 
int a; 
int b; 
}MY_TYPE;

这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: 
MY_TYPE tmp;

第二种用法:typedef 原变量类型 别名

简单的函数指针的用法

//形式1:返回类型(*函数名)(参数表)

char(*pFun)(int);

//typedef char(*pFun)(int)   //跟上一行功能等同

/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

char glFun(int a){return;}

void main()

{

pFun =glFun;

(*pFun)(2);

}

第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值

第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针函数名指向该函数的代码在内存中的首地址

下面是一个例子:

  1. //#include<iostream.h>
  2. #include<stdio.h>
  3. typedef int (*FP_CALC)(intint);
  4. //注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看
  5. int add(int a, int b)
  6. {
  7. return a + b;
  8. }
  9. int sub(int a, int b)
  10. {
  11. return a - b;
  12. }
  13. int mul(int a, int b)
  14. {
  15. return a * b;
  16. }
  17. int div(int a, int b)
  18. {
  19. return b? a/b : -1;
  20. }
  21. //定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、
  22. //返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址
  23. FP_CALC calc_func(char op)
  24. {
  25. switch (op)
  26. {
  27. case '+': return add;//返回函数的地址
  28. case '-': return sub;
  29. case '*': return mul;
  30. case '/': return div;
  31. default:
  32. return NULL;
  33. }
  34. return NULL;
  35. }
  36. //s_calc_func为函数,它的参数是 op,
  37. //返回值为一个拥有 两个int参数、返回类型为int 的函数指针
  38. int (*s_calc_func(char op)) (intint)
  39. {
  40. return calc_func(op);
  41. }
  42. //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
  43. int calc(int a, int b, char op)
  44. {
  45. FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址
  46. int (*s_fp)(intint) = s_calc_func(op);//用于测试
  47. // ASSERT(fp == s_fp);    // 可以断言这俩是相等的
  48. if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果
  49. else return -1;
  50. }
  51. void main()
  52. {
  53. int a = 100, b = 20;
  54. printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
  55. printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
  56. printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
  57. printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
  58. }
  59. 运行结果

    calc(100, 20, +) = 120

    calc(100, 20, -) = 80

    calc(100, 20, *) = 2000

    calc(100, 20, /) = 5

(转)typedef 函数指针的用法的更多相关文章

  1. typedef 函数指针的用法

    转自:http://www.cnblogs.com/shenlian/archive/2011/05/21/2053149.html typedef 函数指针的用法 在网上搜索函数指针,看到一个例子. ...

  2. IOS typedef 函数指针的用法

    代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字. 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换. 用 ...

  3. C 中typedef 函数指针的使用

    类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer;     //整型变量int *pointer ...

  4. C++------------typedef 函数指针类型定义

    摘要bycrazyhacking:        typedef 是定义了一种"函数指针"类型,可以再声明很多变量.函数指针的定义是定义了一个变量. int max(int x,i ...

  5. typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

    首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...

  6. C中typedef 函数指针的使用

    类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer;     //整型变量int *pointer ...

  7. typedef 返回类型(*Function)(参数表) ——typedef函数指针

    //首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...

  8. typedef函数指针用法

    typedef void(*vp)(); 将vp声明为一个函数指针类型,该类型的指可以针指向一个没有参数,带空返回值的函数. 调用方法vp p;创建一个vp类型的函数指针p void print(vp ...

  9. c/c++ 函数指针的用法

    [目录] 基本定义 c 函数指针使用举例 c++ 函数指针使用举例 函数指针作为函数参数 函数指针作为函数返回值 函数指针数组 typedef 简化函数指针操作 c语言函数指针的定义形式:返回类型 ( ...

随机推荐

  1. [原创]JAVA技巧:去除ArrayList<Object>里面的重复记录

    简单说明 ArrayList中保存的是某种类型的对象,如User,现在需要将对象属性userid重复的都去掉,使userid唯一,要如何处理? 实现步骤 代码如下方所示,实现一个Comparator的 ...

  2. python标准库介绍——28 md5 模块详解

    ==md5 模块== ``md5`` (Message-Digest Algorithm 5)模块用于计算信息密文(信息摘要). ``md5`` 算法计算一个强壮的128位密文. 这意味着如果两个字符 ...

  3. Securecrt emacs/vi 代码无法高亮、无颜色

    无法高亮: 这是因为.bashrc中没有 export term=linux 最后,代码恢复正常:

  4. thinkphp中获取参数值的方法

    以获取$type这个参数为例:一:通过传统方法:$_GET, $_POST    $type = intval($_GET['type'])这种方法需要自己写过滤规则,保证数据安全. 二:在Actio ...

  5. 【转】使用create_project.py创建cocos2d项目时出错

    命令格式:create_project.py -project 项目名字 -package 包名 -language cpp,例如: create_project.py -project HelloC ...

  6. 让easyui的datagrid的field支持属性的子属性(field.childfield)

    如果不修改后台返回的数据格式,就只能修改easyui的源代码了. 首先在easyui的源代码中找到下面的部分,VS可以用 “var.*_.+=.*_.+\[.*_.+\];” 这个正则表达式来查找,会 ...

  7. 如何让div在整个页面中居中?

    参考必应主页的样式,在页面中放置一个表格,100%宽高,然后表格内部是一个单元格,在单元格内部放置div,使其margin为auto即可. <table style="height: ...

  8. C#字符串中特殊字符的转义

    再基础的东西不常用的话就得记下来...不然就忘记了. 比如C#中对字符串中特殊字符的转义,一个是双引号",另一个就是转义符\ 对于同样一个字符串:地址:"C:\Users\E.tx ...

  9. 如何学好FPGA

    http://bbs.elecfans.com/jishu_278578_1_1.html 掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用FPGA可以让设计变得非常有灵活性.掌握了FP ...

  10. cocos2d-x 3.0点击响应

    迄今为止,发现cocos2d-x 3.0最让人惊艳的地方就是更改了点击事件机制.(ps:迄今只看了点击事件这块,捂嘴笑~~~) cocos2d-x 2.0 只有CCLayer有点击事件处理,需要注册, ...