博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)typedef 函数指针的用法
阅读量:7048 次
发布时间:2019-06-28

本文共 2389 字,大约阅读时间需要 7 分钟。

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

       calc(100, 20, +) = 120

       calc(100, 20, -) = 80

       calc(100, 20, *) = 2000

       calc(100, 20, /) = 5

    来自: 

转载地址:http://zfzol.baihongyu.com/

你可能感兴趣的文章
TensorFlow模型的签名推荐与快速上线\n
查看>>
改变的六条规则
查看>>
GitHub是如何改进自身的DNS架构的
查看>>
IntelliJ IDEA 2018.3 新版本发布,支持 Java 12及Spring Boot增强等特性
查看>>
阿里重磅发布大规模图神经网络平台AliGraph,架构算法解读
查看>>
AWS Amplify Console:赋予应用程序快速部署的能力
查看>>
Git漏洞导致攻击者可在用户电脑上运行任意代码
查看>>
书评 —— 《Go语言编程》
查看>>
红帽收购混合云管理提供商NooBaa,混合云爆发节点临近!
查看>>
保持分布式团队同步
查看>>
QCon上海2015盛大开幕
查看>>
Jakarta EE:云原生Java的新平台
查看>>
2018 Node.js用户调查报告显示社区仍然在快速成长
查看>>
WhiteSource推出免费开源的漏洞检查工具
查看>>
聊天机器人已死,为什么腾讯还要打造自己的智能客服?
查看>>
如何打造一流的查询引擎,构建优秀的数据仓库?
查看>>
想要高效上传下载?试试去中心化的Docker镜像仓库设计
查看>>
Java的序列化特性将要退出历史舞台了
查看>>
Netty 学习和进阶策略
查看>>
Leetcode 16. 3Sum Closest
查看>>