C_C_语言中函数指针的深入分析与应用.kdh
- 格式:pdf
- 大小:88.40 KB
- 文档页数:2
软件开发与设计SOFTWARE DEVELOPMENT AND DESIGN1概述在C/C++程序中,对象(变量)存储在程序的内存空间中,并对应着惟一的地址。
确切地讲,这个地址还跟对象(变量)的类型(auto,static,global,etc)有关。
同样,函数与对象(变量)相似,它也有自己惟一的地址与之对应。
那么,就可以定义一个指针指向该地址(函数),这个指向函数的指针就叫做函数指针。
与函数指针相似的一个术语是指针函数,表示其返回值是指针类型的函数。
2定义所有的C/C++中的对象(变量)必须经过定义才能够使用,函数指针也不例外。
函数指针的定义与对象(变量)类似,略有不同。
函数指针定义的一般形式为:Return_Type(*Function_Fointer)(Argulist)。
示例(一):pointer to object pointer to functionint i;int f(int arg);definition:int*int_ptr=&i;definition:int(*func_ptr) (int arg)=&f;注意函数指针定义中括号的使用保证了*和func_ptr的优先结合,否则func_ptr将变成一个返回值为指针的普通函数。
函数指针中一个非常重要的问题是要保证函数指针的类型与它所指向的函数的一致性,比如示例一中func_ptr与f的返回类型和参数列表都是一致的,这样才不会报错。
函数指针的初始化和赋值有二种方式,第一种方式如示例一所示,对函数名使用取址运算符&。
由于函数名本身就代表着入口地址,所以也可以直接把函数名赋给函数指针,那么示例一中可改为:int(*func_ptr)(int arg)=f。
示例(二)typedef used in function pointer definition:typedef char(*PTRFUN)(int);PTRFUN pFun;char glFun(int a){return;}void main(){pFun=glFun;(*pFun)(2);}运用typedef可以使函数指针的定义和使用更加方便和简洁。
在示例二中,typedef的使用是程序更加明朗和可读。
示例(二)explicit dereference of the function pointer:extern void swap(int x,int y);void(*func_ptr)(int x,int y)=f;(*funcptr)(3,2);/*explicit call*/typedef的功能是定义新的类型。
示例二中第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。
后面就可以像使用int,char一样使用PTRFUN了。
3使用通过函数指针去调用函数有两种方法,包括隐性(ex-plicit)和显性(implicit)调用。
显性调用如示例三所示。
隐性调用只需要将(*funcptr)(3,2)改为funcptr(3,2)即可。
这两种方法完全是等同的,具体由个人爱好所决定。
4应用4.1应用技巧函数指针(function pointer)是一类特殊的指针,它在C/ C++编程中有着广泛的应用。
函数指针主要有两个方面的用途:调用函数和做函数的参数。
利用函数指针作为参数和调用函数,就开创了许多程序设计中的可能和技巧,主要体现在以下3个方面:(1)多态(polymorphism)。
多态实现的机制十分复杂,C/C++语言中函数指针的深入分析与应用张海平(深圳信息职业技术学院电子通信技术系,深圳518029)摘要:对C/C++语言程序设计中函数指针进行了详细的分析与研究,包括函数指针的概念、定义和调用,并着重通过回调函数与简单消息映射实例阐述函数指针的使用方法和技巧。
关键词:函数指针;回调函数;C/C++语言;对象(变量)Deep Analysis and Application of the Function Pointer in the C/C++LanguageProgrammingZHANG Haiping(Department of Electronic communications,Shenzhen institute of information Vocalional Technology,Shenzhen518029)Abstract:In this paper,the function pointer in the C/C++language programming is analyzed and researched in detail,in-cluding the concepts,definitions and calls,and focus on the use of methods and techniques through two examples—the call-back function and the message map.Key words:function pointer;call-back function;C/C++language;object(variable)本文收稿日期:2009-9-2217--电脑编程技巧与维护其中虚函数表起着重要的作用。
一般来讲,编译器会为数据结构加入一项成员,是一个指向虚函数表的指针(经常被称为vptr),而虚函数表中存放的是由函数指针组成的数组,函数指针指向实际所调用的函数。
(2)回调函数(call-back)。
实现回调函数的关键是函数指针作为函数的参数。
回调函数应用的非常广泛,例如Win32的WinProc其实就是一种回调,用来处理窗口的信息。
(3)取代switch–case语句。
switch-case语句在选择项数上和程序维护上有一定的限制,使用函数指针可以解决这一问题。
4.2应用实例4.2.1消息映射雏形Windows程序是以消息为基础的,其消息映射极其复杂,函数指针发挥着重要的作用。
下面用一个简单的消息映射雏形来说明函数指针的使用方法和技巧。
定义一个MSGMAP结构和一个cou宏:struct MSGMAP{UINT nMessage;LONG(*pfg)(HWND,UINT,WPARAM,LPARAM);};#define cou(x)(sizeof(x)/sizeof(x[0]))MSGMAP结构中第二个元素pfn是一个函数指针,以此指针所指的函数处理nMessage消息。
设计一个数组_messageEneries[]把程序中预处理的消息以及消息处理函数的关联性建立起来。
Struct MSGMAP_messageEneries[]={WM_CREATE,OnCreate,WM_PAINT,OnPaint,WM_SIZE,OnSize,WM_COMMAND,OnCommand,WM_CLOSE,OnClose,};WM_CREATE,WM_PAINT,WM_SIZE,WM_COM-MAND,WM_CLOSE是待处理的消息,OnCreate,On-Paint,OnSize,OnCommand,OnClose是对应处理函数的函数名。
窗口函数的设计:LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){int i;for(i=0;i<cou(_messageEntries);i++){if(message==_messageEntries[i].nMessage)return((*messageEntries[i].pfn)(hWnd,message, wParam,lparam));}return(DefWindowProc(hWnd,message,wParam, lParam));}可以看出,WndProc函数永远不必改变,每当有新的要处理的消息时,只需在_messageEntries[]数组中加入新的元素即可。
而函数指针在整个消息映射中扮演十分关键的角色。
4.2.2回调函数回调函数是一个通过函数指针调用的函数。
如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来用它所指向的函数时,就说这是回调函数。
回调函数使用的场合很多,下面就通过一个简单回调函数实例来阐述函数指针在回调函数中的应用。
假设BarrelVolume是库函数中用来计算柱体体积的一个函数,定义如下:double BarrelVolume(double height,double(*lArea) (double a,double b)){return height*(*lArea)(a,b);}由于不同类型柱体底面积的计算方法不一样,用户可以根据需要编写自己的面积计算函数,通过函数指针传递进去,增加了程序的维护性和简洁性。
如果用户计算圆柱的体积,可以这样编写:double Area0(double a,double b)//{returnπ*a*b;}double height0;double volume=BarrelVolume(height0,&Area0);如果用户计算三棱柱的体积,代码为:double Area1(double a,double b)//{return a*b*(0.5);}double height1;double volume=BarrelVolume(height1,&Area1);其中Area0(),Area1()为回调函数。
5结语函数指针由于定义复杂,抽象难懂,使用技巧性强,是C/C++程序设计学习中的难点。
,在程序设计的过程中,要认真思考,巧妙应用,克服函数指针的致命缺点(函数指针无法对参数和返回值的类型进行检查),利用函数指针设计出优秀的程序代码。
参考文献[1]汪明光.C++语言中函数指针的分析与应用.巢湖学院学报,2006,(3):30-33.[2]李永祥,陈意云.基于函数指针数组的代码迷惑技术.计算机学报,2004,(12):1707-1708.[3]侯俊杰.深入浅出MFC.武汉:华中科技大学出版社,2001.[4]Andrew koening,Barbara Moo.Ruminattion on C++.北京:人民邮电出版社,2008.作者简介张海平,男(1983-),硕士研究生,主要研究方向:C语言程序设计教学,数值分析。
18 --。