函数指针与回调函数

Posted hxhlrq

tags:

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

引入:数组

我们知道,在c/c++语言中,无论是数组中存储的是哪一种数据类型的元素,数组都占一块连续的内存空间。而数组名就是首元素的地址,也就是数组所占的连续内存空间的首字节的地址。如程序所示:

#include<cstdio>
#include<iostream>
#include<string>

using namespace std;

int main()
{
    int a[] = {0,1,2,3,4,5,6};
    cout << a << endl;
    cout << &a[0] << endl;
    cout << &a[1] << endl;
    int* p = a;
    cout << *p+100 << endl;
    cout << *(p+1) << endl;
    return 0;
}

上述代码输出结果可以说名,数组名可以当作该数组的指针使用,也就是数组名是一个指针变量,指向数组所占据的连续的内存空间。或者说数组名可以被认为数操作该内存区域的入口。

主题:函数的存储

一个函数在内存空间中也总是占据一块连续的内存空间。而函数名往往就是这块连续内存空间的首地址。编译器在进行编译时,每个函数都有一个入口地址,这个入口地址就是函数所占连续内存空间的首地址,也就是函数名。在这一点上与数组的存储非常相似。同时,这个函数所占据的连续内存空间的首地址就是指向该函数的指针。我们把这个函数的首地址赋予一个指针变量,使该指针变量指向函数所在的内存空间,那么我们就可以通过这个指针变量找到并调用该函数。这个指针变量就是函数指针。函数指针通常有两个用途:调用该函数和将该函数作为函数的参数。

上段我们提到,数组名是函数所占的连续内存空间的首地址,所以我们在创建函数指针的时候会使用函数名来创建。将函数名的所代表的地址赋给一个函数指针变量。

函数指针的定义类型为

returntype(*pointername)(param list);

//returntype是这个函数指针指向的函数的返回值类型
//pointername 是自己所定义的函数指针的名字
//param list 是函数参数列表。该列表可同时给出参数的类型和名称,也可只给出参数类型。

//因为()的优先级高于*,所以第一个括号不能省略。如果写成returntype* pointnerame(param list);就会称为一个新定义的函数原型。

创建函数指针的完整语句和使用函数指针的完整语句

函数名本身就是指向函数所在的连续空间,是该连续空间的首地址。而我们在创建函数指针的时候,创建的指针变量也是存储的是函数所占连续空间的首地址,所以在一定程度上,函数名和创建的指针变量可以认为是相同的。所以我们在使用函数指针的时候和使用函数名的方法类似。

returntype (*pointername)(param list) = functionname;
//functionname为函数名
//使用定义好的函数指针

//执行函数指针指向的函数

(*pointername)(param list);

如下例子有

#include<cstdio>
#include<iostream>
#include<string>

using namespace std;

void test()
{
    cout << "hello,world" << endl;
}
int max(int a,int b)
{
    if (a > b)
    {
        return a;
    }
    return b;
}
int main()
{
    void(*function_point)() = test;
    (*function_point)();

    int(*maxmum)(int,int) = max;
    int c = (*maxmum)(3, 10);
    cout << c << endl;
    
    return 0;
}

 

下面再介绍两种新的函数指针使用方法

#include<cstdio>
#include<iostream>
#include<string>

using namespace std;

void test()
{
    cout << "hello,world" << endl;
}
int max(int a,int b)
{
    if (a > b)
    {
        return a;
    }
    return b;
}
int main()
{
    //typedef 原类型名 别名; 是用来给变量的数据类型起一个别名
    //但typedef也可以用来定义新的数据类型

    typedef void(*function_pointer)();
    //定义了一种函数指针。这个函数指针类型名为function_pointer。
    //这个函数指针指向一个函数,并且函数的参数表为空,并且函数的返回值为空。

    typedef int(*maxmum)(int a,int b);
    //定义了一种函数指针,这个函数指针的类型名为maxmum
    //这个函数指针指向一个函数,且函数的参数表只有一个int型参数,并且函数的返回值为int型。
    
    function_pointer p1 = test;
    maxmum p2 = max;

    //调用函数
    p1();
    int c = p2(3,10);
    cout << c << endl;
    
    return 0;
}

 

接下来进入我们今天的主题——回调函数

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

函数指针与回调函数

C语言函数指针之回调函数

函数指针与回调函数

c++异步回调函数引用传递空指针异常

函数指针与回调函数

如何快速理解函数指针与回调函数?