首页 typedef函数指针的用法

typedef函数指针的用法

举报
开通vip

typedef函数指针的用法typedef函数指针的用法 indoc.in typedef函数指针的用法 在网上搜索函数指针,看到一个例子。开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它。其实很多时候都是这样,如果每次到难一点的内容,总想着下次我再来解决它,那就永远也学不到东西。 后面那个例子加了注释,是我对这种用法的理解,希望对新手有所帮助。 进入正文: 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字...

typedef函数指针的用法
typedef函数指针的用法 indoc.in typedef函数指针的用法 在网上搜索函数指针,看到一个例子。开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它。其实很多时候都是这样,如果每次到难一点的内容,总想着下次我再来解决它,那就永远也学不到东西。 后面那个例子加了注释,是我对这种用法的理解,希望对新手有所帮助。 进入正文: 代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字。 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。 用法一: typedef int (*MYFUN)(int, int); 文章内容版权归原作者所有 VICHU.NET indoc.in 这种用法一般用在给函数定义别名的时候 上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int 在分析这种形式的定义的时候可以用下面的方法: 先去掉typedef 和别名, 剩下的就是原变量的类型. 去掉typedef和MYFUN以后就剩: int (*)(int, int) 用法二: typedef给变量类型定义一个别名. typedef struct{ int a; int b; 文章内容版权归原作者所有 VICHU.NET indoc.in }MY_TYPE; 这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: MY_TYPE tmp; 第二种用法:typedef 原变量类型 别名 简单的函数指针的用法 //形式1:返回类型(*函数名)(参数 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ) char(*pFun)(int); //typedef char(*pFun)(int) //跟上一行功能等同 /*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/ char glFun(int a){return;} void main() 文章内容版权归原作者所有 VICHU.NET indoc.in { pFun =glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。 下面是一个例子: 1 //#include 2 #include 3 文章内容版权归原作者所有 VICHU.NET indoc.in 4 typedef int (*FP_CALC)(int, int); 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) 文章内容版权归原作者所有 VICHU.NET indoc.in 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) 文章内容版权归原作者所有 VICHU.NET indoc.in 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; 文章内容版权归原作者所有 VICHU.NET indoc.in 36 } 37 //s_calc_func为函数,它的参数是 op, 两个int参数、返回类型为int 的函数指针 38 //返回值为一个拥有 39 int (*s_calc_func(char op)) (int, int) 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); //根据预算符得到各种运算的函数的地址 文章内容版权归原作者所有 VICHU.NET indoc.in 47 int (*s_fp)(int, int) = 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 文章内容版权归原作者所有 VICHU.NET indoc.in 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 63 运行结果 calc(100, 20, +) = 120 calc(100, 20, -) = 80 文章内容版权归原作者所有 VICHU.NET indoc.in calc(100, 20, *) = 2000 calc(100, 20, /) = 5 文章内容版权归原作者所有 VICHU.NET
本文档为【typedef函数指针的用法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:40KB
软件:Word
页数:7
分类:生活休闲
上传时间:2017-12-11
浏览量:14