函数指针与回调函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针与回调函数相关的知识,希望对你有一定的参考价值。

一、函数指针

  1、  函数指针就是一个指针变量,用来指向函数地址。正在运行的程序(进程)在内存中占据一定的空间。进程包括编译好的程序代码和需要使用的变量。因此,程序代码中的函数就是一些字符域,要得到一个函数地址,也就是得到这些字符域的起始地址。

    2、 函数指针的三种形式:
    指向普通C函数的函数指针        --- C语言中的函数指针
    指向C++类静态成员函数的函数指针    --- C++
    指向C++类非静态成员函数的函数指针   --- C++

    函数指针的本质自然也就是函数地址。  类成员函数的地址表示和普通C函数的地址是不一样的。要表示一个类例的成员函数,光有函数地址还不够,因为每个类实例拥有一个非静态成员函数,而每个实例在内存中都要占据一定的空间,所以, 非静态类成员函数的地址由两部分组成,一 个是 实例地址,一个是 函数地址。实例地址通过隐含的this指针来传递。函数地址就是函数在实例所占内存中的偏移地址,只不过这个地址通过函数名取得,并不需要关心其偏移具体的多少.

    静态成员函数和 非静态成员函数的区别:静态成员函数并不是第个实例都拥有一个这样的函数。所以,静态成员函数的地址并不需要实例地址,也就是说,没有this指针。其地址实质上和普通的C函数地址是一样的,只不过在定义函数指针时会有所不同。

   第一种和第三种的区别,两者的区别:要得到一个类实例的成员函数指向非静态成员函数的函数指针需要一个隐含参数:指向类实例的this指针。而指向普通C函数的函数指针只需要得到函数地址既可。 这两种类型的函数指针是不兼容的(不可互相赋值)。


3、函数指针的定义:
    指向普通函数的指针:
    int (*pfun)(float, char, char) = NULL;                       // C

    指向类成员函数的指针:
    int (myclass::*pmember)(float, char, char) = NULL;               // C++
    int (myclass::*pconstmember)(float, char,char) const = NULL;      // C++

    todo : 指向静态成员函数的函数指针定义

二、回调函数

 1、回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

 2、使用回调函数,需要:

  • 声明

  • 定义

  • 设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

    注:声明和定义时,回调函数由系统调用。

3、回调函数:一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。通过一个统一接口实现不同的内容。




本文出自 “花开彼岸” 博客,请务必保留此出处http://zxtong.blog.51cto.com/10697148/1783582

以上是关于函数指针与回调函数的主要内容,如果未能解决你的问题,请参考以下文章

在类内部处理回调时必须调用对非静态成员函数的引用

C++使用模板类调用非静态成员函数

C++之静态

错误分析:非静态成员引用必须与特定对象相对

关于虚函数,类的内存分布以及类的成员函数调用原理

成员变量和成员函数分开存储