1.简单的函数指针的应用

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

[cpp] view plain copy

  1. char (*pFun)(int);

  2. char glFun(int a){ return;}

  3. void main()

  4. {

  5. pFun = glFun;

  6. (*pFun)(2);

  7. }

第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
         第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址
         然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。

2.使用typedef更直观更方便

形式1:typedef  返回类型(*新类型)(参数表)

[cpp] view plain copy

  1. typedef char (*PTRFUN)(int);

  2. PTRFUN pFun;

  3. char glFun(int a){ return;}

  4. void main()

  5. {

  6. pFun = glFun;

  7. (*pFun)(2);

  8. }

typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
           第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。

3.例子说明

[cpp] view plain copy

  1. #include <stdio.h>

  2. #include <assert.h>

  3. typedef int (*FP_CALC)(int,int);//定义一个函数指针类型

  4. int add(int a, int b)

  5. {

  6. return a + b;

  7. }

  8. int sub(int a, int b)

  9. {

  10. return a - b;

  11. }

  12. int mul(int a, int b)

  13. {

  14. return a * b;

  15. }

  16. int div(int a, int b)

  17. {

  18. return b ? a/b : -1;

  19. }

  20. //定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、

  21. //返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址

  22. FP_CALC calc_func(char op)

  23. {

  24. switch( op )

  25. {

  26. case '+':

  27. return add;

  28. case '-':

  29. return sub;

  30. case '*':

  31. return mul;

  32. case '/':

  33. return div;

  34. default:

  35. return NULL;

  36. }

  37. return NULL;

  38. }

  39. //s_calc_func为函数,它的参数是 op,

  40. //返回值为一个拥有两个int参数、返回类型为int的函数指针

  41. int (*s_calc_func(char op)) (int , int)

  42. {

  43. return calc_func(op);

  44. }

  45. //最终用户直接调用的函数,该函数接收两个int整数,

  46. //和一个算术运算符,返回两数的运算结果

  47. int calc(int a, int b, char op)

  48. {

  49. FP_CALC fp = calc_func(op);

  50. int (*s_fp)(int,int) = s_calc_func(op);//用于测试

  51. assert(fp == s_fp);// 可以断言这两个是相等的

  52. if(fp)

  53. return fp(a,b);

  54. else

  55. return -1;

  56. }

  57. void main()

  58. {

  59. int a = 100, b = 20;

  60. printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));

  61. printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));

  62. printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));

  63. printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));

  64. }

转载于:https://blog.51cto.com/lindt/1791024

typedef函数指针用法相关推荐

  1. typedef函数指针用法 .

    1.简单的函数指针的应用 形式1:返回类型(*函数名)(参数表) [cpp] view plaincopyprint? char (*pFun)(int); char glFun(int a){ re ...

  2. C语言typedef函数指针用法

    1.简单的函数指针的应用 形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = ...

  3. 【转】typedef函数指针的用法(C++)

    原文: typedef函数指针的用法(C++) 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字. 不同点:typedef 在编译时被解释,因 ...

  4. typedef函数指针

    由于之前学习C++这块内容并没有经过太多实践,这块内容已经忘记了不少,现在学到动态库用到这块内容,又重新整理了.接下来的几天将会学习更多的动态库静态库的知识,学完之快内容之后,就学习excel等off ...

  5. typedef 函数指针的用法

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

  6. 函数指针c语言typedef,typedef 函数指针的用法(附例子)

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

  7. typedef 函数指针

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

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

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

  9. typedef函数指针_C语言函数指针之回调函数

    1 什么是回调函数? 首先什么是"回调"呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调. 如果代码立即被执行就称为同 ...

最新文章

  1. 单张图像重建3D人手、人脸和人体
  2. Sql Server 2005 存储过程分页
  3. Elasticsearch之type底层结构及弃用原因
  4. python中文开发环境_Python开发环境配置
  5. Javasript设计模式之链式调用
  6. 荣耀份额重回中国市场前三;​特斯拉使用替代芯片重写汽车软件;RabbitMQ 3.9.0 发布|极客日报...
  7. mysql自动备份linux_Mysql for linux mysql自动备份脚本
  8. iPhone的Push(推送通知)功能原理浅析
  9. mysql 基本命令整理(1)
  10. XX 公司网络信息系统的安全方案设计书
  11. 如何向VISUAL SVN SERVER上传文件
  12. c# Socket Udp通讯示例源码
  13. oracle按月统计按季度统计,Oracle数据库按月统计(候,旬,月,季,年)
  14. 凡诺cms2.1文件包含漏洞分析
  15. 键盘录入(身高和体重)
  16. appfuse 1.9.2 的AOB (面向方面的bug)
  17. 爱奇艺视频与腾讯视频竞品分析
  18. 2022年模式识别高峰论坛学习笔记
  19. JavaScript中的触发事件
  20. ms sql server 2000挂起问题解决

热门文章

  1. sybase笔记 2762错误
  2. VLAN,trunk,以太网通道
  3. c++exe程序在别人电脑上双击无法打开_电脑换新系统的应用可以这样快速迁移
  4. IVs提取合并工具ivstools
  5. SQLite添加列的限制
  6. Swift3.0语言教程替换子字符串
  7. Kali Linux 安全渗透教程第六更1.4.2 安装至USB驱动器Kali Linux
  8. __weak与__block的区别
  9. 查看TensorFlow的版本和路径
  10. 人机交互时,你认为机器人是有意识的还是无意识的?