一、为什么要有函数指针?
函数与数据项相似,函数也有地址。我们希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。
二、怎么获取函数的地址?
获取函数的地址的方法很简单:只要使用函数名(不用跟参数)即可。
例如: 函数: void function( int a) ;
则function就是该函数的地址。
三、怎么声明一个函数指针?
我们知道:声明指向某种数据类型的指针时,必须指定指针指向的类型。
所以,我们声明指向函数的指针时,也必须指定指针指向的函数的类型。意味着我们必须在声明中包括函数的返回值类型与参数列表。下面是一个声明举例:
函数:double average(int , int );
函数指针声明:double (*pa) (int , int ); //函数指针变量是pa
注意:通过上例我们可以发现:要声明指向指定类型的函数的指针,可以首先编写这种函数的原型(函数声明),然后用(*pa)替代函数名。这样pa就是这类函数的指针。
四、怎么使用函数指针来调用函数?
例:
double pam(int); //声明函数原型
double (*pa)(int); //声明指向上面函数原型的指针
pa = pam; //向函数指针赋值
double x = (*pa)(5); //使用pa调用函数pam,传递参数5,定义变量x接收函数返回值
其实,C++中除了这样使用:double x = (*pa)(5);
也允许像函数名一样使用函数指针: double x = pa(5);
但推荐使用前者,因为前者它表达的意图很明确:我在使用函数指针!
五、一个使用函数指针的实例:
源代码:
#include <iostream>
using namespace std;
void EatMeat(int num)
{
cout << "我吃了 " << num << " 片肉\n" << endl;
}
void DrinkWater(int num)
{
cout << "我喝了 " << num << " 杯水\n" << endl;
}
void DoSomething(void(*pa)(int), int num)
{
cout << "我要做一些事情: " ;
(*pa)(num); //使用函数指针调用函数
}
int main(void)
{
void(*pa)(int); //声明一个指向返回值为void,参数为int的函数的指针
pa = EatMeat; //先吃肉
DoSomething(pa, 1); //吃一片肉
pa = DrinkWater; //再喝水
DoSomething(pa, 10); //喝十杯水
return 0;
}
运行截图: