指针(四)- 函数指针和回调函数
函数指针
函数的二进制代码存放在内存四区中的代码段,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。
使用函数指针的三个步骤:
a)声明函数指针;
b)让函数指针指向函数的地址;
c)通过函数指针调用函数。
1)声明函数指针
声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值和参数列表(函数名和形参名不是)
假设函数的原型是:
int func1(int bh,string str);
则函数指针的声明是:
int (*pfa)(int,string);
pfa是函数指针名,必须用括号,否则就成了返回指针的函数。
2)函数指针的赋值
函数名就是函数的地址。
函数指针的赋值:函数指针名=函数名;
3)函数指针的调用
(*函数指针名)(实参);
函数指针名(实参);
#include<iostream>
using namespace std;
void func(string str)
{
cout<<"函数指针示例"<<endl;
}
int main(){
string message = "调用函数指针的信息";
func(message); //普通调用
void (*func)(string); //声明函数指针
pfunc = func; //对函数指针赋值,语法是函数指针名 = 函数名。
pfunc(message); //用函数指针名调用函数。C++
(*pfunc)(message); //用函数指针名调用函数。C语言。
}
回调函数是把一个函数的代码嵌入到另外一个函数中,调用函数提供了·主体的流程和框架,具体功能由回调函数来完成。在写调用函数时,只要确定回调函数的种类,不关心回调函数的功能。
如何让给回调函数传参:
由调用函数提供实参
把实参从外面传进去
#include<iostream>
using namespace std;
void print(string str) //回调函数
{
cout << "str = " << str << endl;
}
void show(void (*pf)(string), int b)
{
string str = "hhhhh"; //通过回调函数传参
pf(str);
}
int main() {
//show(print);
show(print, 5);
return 0;
}