参考
C++ Primer Plus (第6版)
函数指针
和数组一样, 函数名就是函数地址
函数指针的声明
double sum(int a, int b); // 声明一个函数
double (*pf)(int a, int b); // 声明一个函数指针
pf = sum;
不加括号和括号是不同的
double * sum(int a, int b); // 声明一个函数, 返回值是一个指针
double (*sum)(int a, int b); // 声明一个函数指针
用了typedef创建别名, 简化代码
typedef double (*sum)(int, int);
double ssum(int a, int b)
{
return a + b;
}
sum a = ssum;
cout << a(1,3) << endl; // 4
函数指针的使用
double sum(int a, int b); // 声明一个函数
double (*pf)(int a, int b); // 声明一个函数指针
pf = sum;
double x = (*pf)(1, 2);
double y = sum(1, 2);
double z = pf(1, 2); // 历史原因, 这个也是可以
x = y = z
函数实例
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
void Cal(string name, int a, int b, double (*func)(int a, int b))
{
stringstream s;
s << name << " cal " << a << "+" << b << "=" << func(a, b);
cout << s.str() << endl;
}
double Add(int a, int b)
{
return a + b;
}
double Mul(int a, int b)
{
return a * b;
}
int main()
{
Cal("aa", 3, 5, Add); //aa cal 3+5=8
Cal("bb", 3, 5, Mul); //bb cal 3+5=15
system("pause");
return 0;
}
函数指针数组声明
double f1(int a[], int b);
double f2(int* , int);
double f3(int[], int);
// 前面定义的都一样
double (*func[3])(int* a, int b) = {f1, f2, f3}; // 声明了3个函数指针, 并且赋值
指向func的地址
*func[3] // 3个指针的数组
(*func)[3] //指一个含有3个元素的数组指针
double (*(*func)[3])(int*, int) = &func;