2015年软件水平考试程序员辅导笔记之浅析函数指针
发布时间:2012/5/21 15:23:52 来源:城市网学院 编辑:ziteng
函数指针的概念是指向函数的指针变量。 因而“函数指针”自己首先应是指针变量,只不外该指针变量指向函数。在大大都情形下我们使用不到,也忽略了它的存在。函数名现实上也是一种指针,指向函数的进口地址,但它又分歧于通俗的如int*、double*指针,看下面的例子来理解函数指针的概念:
view plain int function( int x, int y );int main ( void )
{ int (*fun) ( int x, int y );int a = 10, b = 20;function( a, b );fun = function;(*fun)( a, b );……
}第一行代码首先界说了一个函数function,其输酬报两个整型数,返回也为一个整型数(输入参数和返回值可为其它任何数据类型);后面又界说了一个函数指针fun,与int*或double*界说指针分歧的是,函数指针的界说必需同时指出输入参数,剖明这是一个函数指针,而且*fun也必需用一对括号括起来;并将函数指针赋值为函数function,前提前提是*fun和function的输入参数和返回值必需连结一致,否则无法经由过程编译。可以直接挪用函数function(),也可以直接挪用函数指针,二者是等效的。
声明函数指针
回调函数是一个轨范员不能显式挪用的函数;经由过程将回调函数的地址传给挪用者从而实现挪用。要实现回调,必需首先界说函数指针。尽管界说的语法有点不成思议,但如不美观你熟悉函数声明的一般体例,便会发现函数指针的声明与函数声明很是近似。请看下面的例子:
void f(); // 函数原型
膳缦沔的语句声了然一个函数,没有输入参数并返回void.那么函数指针的声明体例如下:
void (*) ();
函数存放在内存的代码区域内,它们同样有地址,我们若何能获得函数的地址呢?
如不美观我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的肇端地址。
界说一个指向函数的指针用如下的形式,以膳缦沔的test()为例:
int (*fp)(int a); //这里就界说了一个指向函数的指针
函数指针绝对不能指向分歧类型,或者是带分歧形参的函数,在界说函数指针的时辰我们很轻易犯如下的错误。
int *fp(int a); //这里是错误的,因为按照连系性和优先级来看就是先和()连系,然后酿成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注重!
例如函数原型为:
int fun(int *, int);
则函数指针可以声明为: int (*pf)(int *, int); [NextPage] 当然从上述例子看不出函数指针的利益,目的主若是想引出函数指针数组的概念。我们从膳缦沔例子可以得知,既然函数名可以经由过程函数指针加以保留,那们也必然能界说一个数组保留若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提前提是,这若干个需要经由过程函数指针数组保留的函数必需有不异的输入、输出值。
view plain //首先界说256个措置函数(及其实现)。
int function0( int *, int );……
int function255( int *, int );
//其次界说函数指针数组,并给数组赋值。
void (*fun[256])( int *, int );
fun[0] = function0;……
fun[255] = function255;
如不美观赋了分歧的值给函数指针,那么挪用者将挪用分歧地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
下面我们来看一个具体的例子:
view plain int test(int a)
{ return a;}
int main(void)
{ int (*fp)(int a);fp = test; //将函数test的地址赋给函数指针fp cout《fp(5)《“|”《(*fp)(10)《endl; //输出fp(5),这是尺度c++的写法,(*fp)(10)这是兼容c说话的尺度写法,两种赞成,但注重区分,避免写的轨范发生移植性问题!
return 0;} typedef界说可以简化函数指针的界说,在界说一个的时辰感受不出来,但界说多了就知道便利了,膳缦沔的代码改写成如下的形式:
view plain int test(int a)
{ return a;}
int main(void)
{ typedef int (*fp)(int a); //注重,这里不是生命函数指针,而是界说一个函数指针的类型,这个类型是自己界说的,类型名为fp fp fpi; //这里操作自己界说的类型名fp界说了一个fpi的函数指针!
fpi = test;cout《fpi(5)《“|”《(*fpi)(10)《endl; //输出fp(5),这是尺度c++的写法,(*fp)(10)这是兼容c说话的尺度写法,两种赞成,但注重区分,避免写的轨范发生移植性问题!
return 0;}