下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SOFTWAREDEVELOPMENTANDDESIGN软件开发与设计C/C+语言中函数指针的深入分析与应用张海平(深圳信息职业技术学院电子通信技术系,深圳518029)摘要:对C/C+语言程序设计中函数指针进行了详细的分析与研究,包括函数指针的概念、定义和调用,并着重通过回调函数与简单消息映射实例阐述函数指针的使用方法和技巧。关键词:函数指针;回调函数;C/C+语言;对象(变量)DeepAnalysisandApplicationoftheFunctionPointerintheC/C+LanguageProgrammingZHANGHaiping(DepartmentofElectroni
2、ccommunications,ShenzheninstituteofinformationVocalionalTechnology,Shenzhen518029)Abstract:Inthispaper,thefunctionpointerintheC/C+languageprogrammingisanalyzedandresearchedindetail,includingtheconcepts,definitionsandcalls,andfocusontheuseofmethodsandtechniquesthroughtwoexamplesthecall-backfunctionan
3、dthemessagemap.Keywords:functionpointer;call-backfunction;C/C+language;object(variable)1概述在C/C+程序中,对象(变量)存储在程序的内存空间中,并对应着惟一的地址。确切地讲,这个地址还跟对象(变量)的类型(auto,static,global,etc)有关。同样,函数与对象(变量)相似,它也有自己惟一的地址与之对应。那么,就可以定义一个指针指向该地址(函数),这个指向函数的指针就叫做函数指针。与函数指针相似的一个术语是指针函数,表示其返回值是指针类型的函数。PTRFUNpFun;charglFun(int
4、a)voidmain()pFun=glFun;(*pFun)(2);return;运用typedef可以使函数指针的定义和使用更加方便和简洁。在示例二中,typedef的使用是程序更加明朗和可读。示例(二)explicitdereferenceofthefunctionpointer:externvoidswap(intx,inty);void(*func_ptr)(intx,inty)=f;(*funcptr)(3,2);/*explicitcall*/2定义所有的C/C+中的对象(变量)必须经过定义才能够使用,函数指针也不例外。函数指针的定义与对象(变量)类似,略有不同。函数指针定义的一般
5、形式为:Return_Type(*Function_Fointer)(Argulist)。示例(一):pointertoobjectpointertofunctioninti;intf(intarg);definition:int*int_ptr=&i;definition:int(*func_ptr)(intarg)=&f;注意函数指针定义中括号的使用保证了*和func_ptr的优先结合,否则func_ptr将变成一个返回值为指针的普通函数。函数指针中一个非常重要的问题是要保证函数指针的类型与它所指向的函数的一致性,比如示例一中func_ptr与f的返回类型和参数列表都是一致
6、的,这样才不会报错。函数指针的初始化和赋值有二种方式,第一种方式如示例一所示,对函数名使用取址运算符&。由于函数名本身就代表着入口地址,所以也可以直接把函数名赋给函数指针,那么示例一中可改为:int(*func_ptr)示例(二)typedefusedinfunctionpointerdefinition:typedefchar(*PTRFUN)(int);typedef的功能是定义新的类型。示例二中第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。3使用通过
7、函数指针去调用函数有两种方法,包括隐性(explicit)和显性(implicit)调用。显性调用如示例三所示。隐*funcptr)(3,2)改为funcptr(3,2)即可。性调用只需要将(这两种方法完全是等同的,具体由个人爱好所决定。4应用函数指针(functionpointer)是一类特殊的指针,它在C/4.1应用技巧C+编程中有着广泛的应用。函数指针主要有两个方面的用途:调用函数和做函数的参数。利用函数指针作为参数和调用函数,就开创了许多程序设计中的可能和技巧,主要体现在以下3个方面:(1)多态(polymorphism)。多态实现的机制十分复杂,(intarg)=f。本文收稿日期:2
8、009-9-22-17-电脑编程技巧与维护其中虚函数表起着重要的作用。一般来讲,编译器会为数据结构加入一项成员,是一个指向虚函数表的指针(经常被称为vptr),而虚函数表中存放的是由函数指针组成的数组,函数指针指向实际所调用的函数。(2)回调函数(call-back)。实现回调函数的关键是函数指针作为函数的参数。回调函数应用的非常广泛,例如Win32的WinProc其实就是一种回调,用来处理窗口的信息。(3)取代switchcase语句。switch-case语句在选择项数上和程序维护上有一定的限制,使用函数指针可以解决这一问题。4.2应用实例Windows程序是以消息为基础的,其消息映射极其
9、复杂,函数指针发挥着重要的作用。下面用一个简单的消息映射雏形来说明函数指针的使用方法和技巧。定义一个MSGMAP结构和一个cou宏:structMSGMAPUINTnMessage;LONG(*pfg)(HWND,UINT,WPARAM,LPARAM);#definecou(x)(sizeof(x)/sizeof(x0)MSGMAP结构中第二个元素pfn是一个函数指针,以此指针所指的函数处理nMessage消息。设计一个数组_messageEneries把程序中预处理的消息以及消息处理函数的关联性建立起来。StructMSGMAP_messageEneries=WM_CREATE,OnCrea
10、te,WM_PAINT,OnPaint,WM_SIZE,OnSize,WM_COMMAND,OnCommand,WM_CLOSE,OnClose,;WM_CREATE,WM_PAINT,WM_SIZE,WM_COMMAND,WM_CLOSE是待处理的消息,OnCreate,OnPaint,OnSize,OnCommand,OnClose是对应处理函数的函数名。窗口函数的设计:LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)inti;for(i=0;i<cou(_messageEntries);i+
11、)if(message=_messageEntriesi.nMessage)return(*messageEntriesi.pfn)(hWnd,message,wParam,lparam);return(DefWindowProc(hWnd,message,wParam,lParam);可以看出,WndProc函数永远不必改变,每当有新的要处理的消息时,只需在_messageEntries数组中加入新的元素即可。而函数指针在整个消息映射中扮演十分关键的角色。回调函数是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来用它所指向的函数时,就说这是回调函
12、数。回调函数使用的场合很多,下面就通过一个简单回调函数实例来阐述函数指针在回调函数中的应用。假设BarrelVolume是库函数中用来计算柱体体积的一个函数,定义如下:doubleBarrelVolume(doubleheight,double(doublea,doubleb)returnheight*(*lArea)(a,b);(*lArea)由于不同类型柱体底面积的计算方法不一样,用户可以根据需要编写自己的面积计算函数,通过函数指针传递进去,增加了程序的维护性和简洁性。如果用户计算圆柱的体积,可以这样编写:doubleArea0(doublea,doubleb)/return*a*b;do
13、ubleheight0;doublevolume=BarrelVolume(height0,&Area0);如果用户计算三棱柱的体积,代码为:doubleArea1(doublea,doubleb)/returna*b*(0.5);doubleheight1;doublevolume=BarrelVolume(height1,&Area1);其中Area0(),Area1()为回调函数。5结语函数指针由于定义复杂,抽象难懂,使用技巧性强,是C/C+程序设计学习中的难点。,在程序设计的过程中,要认真思考,巧妙应用,克服函数指针的致命缺点(函数指针无法对参数和返回值的类型进行检查),利用函数指针设计出优秀的程序代码。参考文献
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 押金合同范本应用指南
- 通信槽探施工合同
- 电力设施建设招投标诚信承诺书
- 产业园环境卫生管理协议
- 环保工程设备安全评估工程队合同
- 环保工程建设项目合同样本
- 市场代理权转让合同
- 垃圾处理灰工施工合同
- 商务租车服务合同
- 建筑装饰电焊工程协议
- 燃气经营安全重大隐患判定标准课件
- 小学一年级数学两位数加减一位数竞赛监控模拟题
- CHT 8023-2011 机载激光雷达数据处理技术规范(正式版)
- 检验科进修汇报课件
- 西方现代艺术赏析(吉林联盟)智慧树知到期末考试答案章节答案2024年吉林大学
- 《通信工程设计与施工》试卷及答案
- (新课标)新冀人版小学科学六年级上册第四单元第13课《动物与能量》说课稿
- 年产10万套新能源车电池托盘和储能箱体项目可行性研究报告
- 低压电工基础知识培训
- MOOC 葡萄酒文化与鉴赏-西北工业大学 中国大学慕课答案
- 人工智能科普教育活动方案
评论
0/150
提交评论