简介
函数的二进制代码存放在内存四区中的代码区,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。
使用函数指针的三个步骤:
1.声明函数指针:
声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值和参数列表(函数名和形参名不是)
函数之间具有相同的返回值类型和参数列表数目和类型都相同即是同一类函数
1.1声明函数指针语法
函数的返回值类型 (*自定义指针名字) (函数形参列表可写名字也可以不写)
usingnamespacestd; voideat_ming(stringfood1) { cout<<"小明吃"<<food1<<endl; } voideat_hong(stringfood2) { cout<<"小红吃饭"<<food2<<endl; } intmain() { //声明函数指针void (*ming_hong_ptr)(string); ming_hong_ptr=eat_ming; //调用ming_hong_ptr("香蕉"); (*ming_hong_ptr)("香蕉"); // 用函数指针名调用函数。 C语言ming_hong_ptr=eat_hong; ming_hong_ptr("苹果"); (*ming_hong_ptr)("苹果"); // 用函数指针名调用函数。 C语言return0; }
2.让函数指针指向函数的地址:
2.1语法:
void (*ming_hong_ptr)(string); ming_hong_ptr=eat_ming;
3.通过函数指针调用函数。
//调用ming_hong_ptr("香蕉"); (*ming_hong_ptr)("香蕉"); // 用函数指针名调用函数。 C语言ming_hong_ptr=eat_hong; ming_hong_ptr("苹果"); (*ming_hong_ptr)("苹果"); // 用函数指针名调用函数。 C语言
回调函数
现有一个饭店小明和小红还有很多不知名的客人,我们不可能用一个函数封装起来它的所有操作,只能封装起开他们的共同操作
例代码:
usingnamespacestd; voideat( stringname, stringfood1) { cout<<name<<"吃"<<food1<<endl; } voidfan_dian() { cout<<"点餐"<<endl; cout<<"做饭"<<endl; eat("某某", "某某食物"); } intmain() { fan_dian() return0; }
在以上代码中我们就只能封装他们的共同性,可是他们的个人习惯也不能没有啊。
此时函数指针就有用了
例代码:
usingnamespacestd; voideat_ming(stringfood1, intspending_power=0) { cout<<"小明吃"<<food1<<endl; cout<<"小明站在凳子上吃"<<endl; } voideat_hong(stringfood2,intspending_power=0 ) { cout<<"小红吃饭"<<food2<<endl; cout<<"小红站在桌子上吃"<<endl; } voidfan_dian(void (*habit)(string,int)) { cout<<"点餐"<<endl; cout<<"做饭"<<endl; habit("香蕉",59); //缺省值没有用,函数指针写有几个参数就要传入几个参数} intmain() { void (*habit)(string,int); habit=eat_ming; fan_dian(habit); habit=eat_hong; fan_dian(habit); return0; }
利用函数指针当形参可以传入你想要的客人习惯