函数指针、回调函数与typedef
1.函数指针
函数指针:我们知道,函数名就是函数的首地址,只要是地址,就可以用指针指向他,而指向函数的指针就是函数指针,而函数指针与指针的用法一致,可以通过指针去调用函数。
函数指针的声明方法:
我们一般的函数声明为:int add (int x);(类型,函数名,(形参))
函数指针声明为:int (*ptr)(int x);(类型)
ptr =add;
下面做具体演示:
#include<iostream>
#include<string>
using namespace std;
int add(int a , int b)
{
return a + b;
}
string add1(string , string )
{
return c + d;
}
int main()
{
int a = 9, b = 6;
string c = "hello", d = "world";
int (*ptr)(int, int);
string (*str) (string, string);//定义指针
str = add1;//指针指向函数
ptr = add;
a = ptr(a, b);
c = str(c, d);//调用函数
cout << "a:" << a << endl;
cout << "c:" << c << endl;
return 0;
}
2.回调函数
回调函数就是通过函数指针调用函数,将函数指针通过参数直接传给另外一个函数,当这个指针用来调用其他函数时,就称这个函数是回调函数。
#include<iostream>
#include<string>
using namespace std;
int add(int a , int b)
{
return a + b;
}
string c = "hello", d = "world";
string add1(string , string )
{
return c + d;
}
int add2(int a, int b, int (*ptr2)(int ,int))//回调函数
{
return (*ptr2)(a, b);
}
int main()
{
int a = 9, b = 6;
int (*ptr)(int, int);
string (*str) (string, string);
str = add1;
ptr = add;
//a = ptr(a, b);
a = add2( a, b, ptr);
//c = str(c, d);
cout << "a:" << a << endl;
cout << "C:" << c << endl;
return 0;
}
我们发现,以上回调函数的函数指针定义有些复杂,所以我们在下面通过typedef进行优化。
#include<iostream>
#include<string>
using namespace std;
typedef int (PTR)(int, int);
int add(int a , int b)
{
return a + b;
}
string add1(string , string )
{
return c + d;
}
//int add2(int a, int b, int (*ptr2)(int ,int))//回调函数
//{
// return (*ptr2)(a, b);
//}
int add2(int a, int b, PTR *ptr2)//回调函数
{
return (*ptr2)(a, b);
}
int main()
{
int a = 9, b = 6;
int (*ptr)(int, int);
string c = "hello", d = "world";
string (*str) (string, string);
str = add1;
ptr = add;
//a = ptr(a, b);
a = add2( a, b, ptr);
//c = str(c, d);
cout << "a:" << a << endl;
cout << "C:" << c << endl;
return 0;
}
在typedef中我们在区分时只需要将语句typedef int (PTR)(int, int)中PTR换为*ptr,便成为了函数指针。
回调函数的意义:
因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
当有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务,这时就会使用回调函数。