typedef 函数指针的用法

来源:互联网 发布:ibm云计算产品 编辑:程序博客网 时间:2024/06/05 18:05

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

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

进入正文:

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

 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的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针函数名指向该函数的代码在内存中的首地址

下面是一个例子:

C代码 复制代码
  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. }  
//#include<iostream.h>#include<stdio.h>typedef int (*FP_CALC)(int, int);//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}int mul(int a, int b){return a * b;}int div(int a, int b){return b? a/b : -1;}//定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、//返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址FP_CALC calc_func(char op){switch (op){case '+': return add;//返回函数的地址case '-': return sub;case '*': return mul;case '/': return div;default:return NULL;}return NULL;}//s_calc_func为函数,它的参数是 op,//返回值为一个拥有 两个int参数、返回类型为int 的函数指针int (*s_calc_func(char op)) (int, int){return calc_func(op);}//最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果int calc(int a, int b, char op){FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址int (*s_fp)(int, int) = s_calc_func(op);//用于测试// ASSERT(fp == s_fp);   // 可以断言这俩是相等的if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果else return -1;}void main(){int a = 100, b = 20;printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));}

运行结果

   calc(100, 20, +) = 120

   calc(100, 20, -) = 80

   calc(100, 20, *) = 2000

   calc(100, 20, /) = 5

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果8id登不上去怎么办 苹果id无法充值怎么办 苹果home键坏了怎么办 天梭手表不动了怎么办 天梭石英表停了怎么办 手机速度变慢了怎么办 机械手表进水有雾气怎么办 苹果7p苹果黑屏怎么办 墨兰叶子有黑斑怎么办 孕妇吃了树莓怎么办 我想做一元夺宝怎么办 美的空调显示e6怎么办 天梭手表进水了怎么办 蚂蚁借呗关闭了怎么办 excel表分成2页怎么办 乐视视频看不了怎么办 小孩发烧到38度怎么办 1岁宝宝发烧38度怎么办 小孩发烧了怎么办如何退烧 微信朋友圈降权怎么办 新开淘宝店没生意怎么办 店铺没流量没访客怎么办 水压低热水器不打火怎么办 毛巾用久了发黄怎么办 洗完毛巾有异味怎么办 洗白衬衫发黄了怎么办 洗车高压管破了怎么办 魔力探测石没了怎么办 苹果激活码忘了怎么办 磨剪子磨换了怎么办 楼梯对着卧室门怎么办 知乎登录不上怎么办 知乎帐号被停用怎么办 把红颜知己睡了怎么办 钱串花叶子黄怎么办 招财树叶子枯萎怎么办 儿童下颌骨后缩怎么办 玻尿酸下巴太尖怎么办 碰到用假币的人怎么办 有人威胁要打我怎么办 w10电池图标没了怎么办