函数指针回调函数.docx

上传人:b****2 文档编号:23552986 上传时间:2023-05-18 格式:DOCX 页数:8 大小:22.40KB
下载 相关 举报
函数指针回调函数.docx_第1页
第1页 / 共8页
函数指针回调函数.docx_第2页
第2页 / 共8页
函数指针回调函数.docx_第3页
第3页 / 共8页
函数指针回调函数.docx_第4页
第4页 / 共8页
函数指针回调函数.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

函数指针回调函数.docx

《函数指针回调函数.docx》由会员分享,可在线阅读,更多相关《函数指针回调函数.docx(8页珍藏版)》请在冰豆网上搜索。

函数指针回调函数.docx

函数指针回调函数

VC++的函数指针和回调函数

(2009-09-1221:

27:

03)韩耀旭

本文简单地讲解VC++的函数指针和回调函数,目的是让您弄懂函数指针和回调函数。

什么是函数指针

函数指针是指向函数的指针变量。

也就是说,它是一个指针变量,而且该指针指向一个函数。

对于指针变量来说,它的值是它指向的变量的地址。

举个例子:

指针变量pi是指向一个整型变量i的指针,则变量i的地址&i就是指针变量pi的值。

也就是说整型变量指针指向一个整型变量,而整型变量指针的值就是它所指的整型变量的地址。

与其它类型指针变量一样,函数指针变量的值就是它指向的函数的地址。

那么什么是函数的地址呢?

我们首先来看函数调用是怎么回事。

在程序运行时,一个函数占用一段连续的内存。

当调用一个函数时,实际上是跳转到函数的入口地址,执行函数体的代码,完成后返回。

函数指针指向一个函数的入口地址,也就是函数存储空间的首地址。

在C语言中,数组名代表数组的首地址,同样函数名代表了函数的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

 

函数指针的定义

 

一般,函数指针的定义格式为:

函数类型(*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

对于函数intf(inta),我们定义一个指向该函数的函数指针fp,采用如下格式:

int(*fp)(inta);

 

函数指针的赋值

 

前面我们已经讲到,在C语言中,函数名代表了函数的首地址,因此在赋值时,直接将函数名赋值给函数指针就可以了。

例如:

intfunc(intx);//声明一个函数

int(*fp)(intx);//定义一个函数指针

fp=func;//将func函数的首地址赋值给指针fp

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针就指向函数func(x)的代码的首地址。

 

通过函数指针调用函数

 

与其它指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*pi等于它所指向的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。

同样地,fp是指向函数func(x)的指针,则*fp就代表它所指向的函数func。

所以在执行了fp=func;之后,(*fp)和func代表同一函数。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。

用函数指针调用函数由三步组成:

 

首先,定义函数指针变量。

例如:

int(*fp)(intx);

然后,给函数指针变量赋值。

例如:

fp=func;(func(x)必须要先有定义)

最后,用(*指针变量)(参数表);调用函数。

例如:

(*fp)(x);(x必须先赋值)。

 

在这里,(*fp)(x);一般写成fp(x);fp(x)是标准C++的写法,(*fp)(x);是兼容C语言的标准写法。

 

总结以上知识,举例说明

 

到目前为止,相信您已经简单了解了函数指针,下面我们举一个简单的、完整的程序进行说明。

 

例1

#include

 

usingnamespacestd;

 

//定义一个函数add,两个输入参数为整型,返回值为整型

intadd(inta,intb)

{

  returna+b;

}

 

//定义一个函数指针变量,该变量所指函数的类型与intadd(int,int)相对应。

int(*padd)(int,int);

 

intmain()

{

      inta1=1;

      intb1=2;

 

//函数指针变量赋值,函数指针指向add函数

      padd=add;

 

      //通过函数指针变量调用函数,与直接调用add函数效果相同

intc1=(*padd)(a1,b1);

//也可以写成intc1=padd(a1,b1);

 

      cout<

 

      return0;

}

编译并运行程序,返回两个数的和3。

 

函数指针的作用

 

现在,相信您已经明白了函数指针,但是,您可能会迷惑:

函数指针到底有什么作用呢?

函数指针是C++一个重要的组成部分,它的最大好处就是实现函数的回调。

 

什么是回调函数

 

函数,我们大家都知道。

函数体是为了完成某种功能的一段代码,一般情况下,我们在主程序中直接调用函数,主程序调用函数是为了完成这部分功能,被调用函数完成后立即返回主程序。

函数的调用,我们都知道,那么什么是回调函数,我们什么时候使用回调函数呢?

初次接触回调函数很难理解,我们先通过下面的图示简单地介绍回调函数。

 

图1

图1,我们很容易理解,它是我们正常调用函数的情况,程序中直接调用函数。

图2

 

图2的理解就有些费解,首先程序A调用函数1,而函数1本身又调用了程序A自己编写的函数2。

函数2就是回调函数。

 

初次理解回调函数确实有些困难,为了让您弄懂它,我在这里再对图2进行一下解释:

在一般情况下,函数1是由系统完成的。

图2改为下图更容易理解:

 

图3

 

我们的程序执行了某项操作,会通知系统,调用系统的函数1执行相应功能,但系统还需调用函数2,函数2的内容是由我们来完成的。

比如,我们按下一个按钮,我们调用系统(也可以说通知系统)完成相应功能,系统首先完成按钮的重画,使其显示为按下状态,同时还要执行按钮被按下后的相应操作。

按钮被按下后的操作内容是由用户来完成的,系统是不能确定的,用户可以根据自己的需要填写内容。

现在您明白了回调函数的好处了吧。

它由程序开发人员完成其实现内容,而是由系统(或其它函数)调用,它使得我们编程更加方便灵活。

 

回调函数的实现

 

回调函数,是通过函数指针实现的。

下面我们举一个最简单的通过函数指针实现回调函数的例子:

//下面的例程模拟单击按钮后的回调

//主函数调用的Function_After_Push_Button函数相当于按钮被按下后通知系统的函数

//OnClick函数是回调函数,相当于按钮被按下具体要执行什么操作,其内容由用户根据自己的需要来完成

 

#include

 

usingnamespacestd;

 

//定义回调函数OnClick

voidOnClick()

{

   cout<<"TheButtonisClick!

"<

}

 

//定义一个函数,该函数的输入参数是一个函数指针

voidFunction_After_Push_Button(void(*pf)())

{

   pf();

}

intmain()

{

   //定义一个函数指针

   void(*pf)();

 

   //给函数指针赋值

   pf=OnClick;

 

   //实现回调

   Function_After_Push_Button(pf);

 

   return0;

}

上例是一个非常简单的回调函数,但并不能完全体现出回调函数的好处。

该例程旨在演示如何使用函数指针实现回调,在实际编程过程中,最常用的还是使用系统规定好的回调函数。

 

和指针函数的区别

 

指针函数就是返回指针的函数,它是一个函数,返回值是指针类型。

当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数。

返回指针的函数,一般定义格式为:

       类型标识符   *函数名(参数表)

如:

int*f(x,y);//与函数指针int(*f)(x,y);对比

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。

f(x,y)是函数,其返回值是指针。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1