一,函数指针
与数据项类似,函数也有地址,函数的地址是存储其二进制代码的起始位置。假设我们设计一个名为processArray()的函数,可以使用不同的方式来处理给定的数组。要实现这种目标,processArray()函数的第二个参数设置为函数指针。要使用函数指针,为此必须完成下面的工作:
1.1,获取函数地址
函数的地址就是函数名。
1.2,声明函数指针
声明指向函数的指针时,也必须指定指针指向的函数类型。这意味着声明必须指定函数的返回值类型以及函数的特征标。为提供正确的运算符优先级,必须在声明中使用括号将*pf括起来。不然,*pf(int)意味着pf是返回指针的函数,而(*pf)(int)意味着pf是一个指向函数的指针。
double (*pf)(int);
double cube(int);
pf = cube;
1.3,使用函数指针来调用函数
(*pf)扮演的角色与函数名相同
double (*pf)(int);
double cube(int);
pf = cube;
(*pf)(5);
1.4,使用typedef简化函数指针的声明
typedef void (*p_fun)(int nums[], int n);
void reverseOrder(int nums[], int n);
p_fun p;
下面是完整的实例:
#include <iostream>
using namespace std;
typedef void (*p_fun)(int nums[], int n);
void processArray(int nums[], int n, p_fun p);
void reverseOrder(int nums[], int n); //逆序输出函数中的元素
void positiveOrder(int nums[], int n); //正序输出函数中的元素
int main()
{
int nums[5] = {1, 2, 3, 4, 5};
int n = 5;
processArray(nums, n, reverseOrder);
processArray(nums, n, positiveOrder);
return 0;
}
void processArray(int nums[], int n, p_fun p){
p(nums, n);
}
void reverseOrder(int nums[], int n){
for(int i = n - 1; i >= 0; i --){
cout<<nums[i]<<" ";
}
cout<<endl;
}
void positiveOrder(int nums[], int n){
for(int i = 0; i < n; i ++){
cout<<nums[i]<<" ";
}
cout<<endl;
}