函数指针与回调函数
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; }
接下来进入我们今天的主题——回调函数
以上是关于函数指针与回调函数的主要内容,如果未能解决你的问题,请参考以下文章