我們通常知道的都是用指針存儲一個變量的地址,這個變量具有跟指針類型相同的數據類型。除了這個功能,指針還可以指向一個函數的地址,進而來調用被指向的函數。
(1) 函數指針的聲明:
int (*pfun)(double, int);
這樣就聲明了一個指向參數類型是double和int的返回值類型是int的函數指針了。
函數指針通常由三部分組成:
1. 指向函數的返回類型
2. 指針名稱
3. 指向函數的形參類型
(2) 如何指向一個函數:
long sum(long a, long b);
long (*pfun)(long, long) = sum;
這樣就用*pfun的函數指針指向了sum這個函數。
簡單實例:
[cpp]
#include <iostream>
using std::cout;
using std::endl;
long sum(long a, long b);
long product(long a, long b);
int main()
{
long (*pdo_it)(long, long);
pdo_it = product;
cout << endl << "3*5 = " << pdo_it(3,5);
pdo_it = sum;
cout << endl << "3*(4*5)+6 = " << pdo_it(product(3,pdo_it(4,5)),6);
cout << endl;
system("pause");
return 0;
}
long product(long a, long b)
{
return a * b;
}
long sum(long a, long b)
{
return a + b;
}
結果是:
(3) 函數指針作為實參:
因為“指向函數的指針”是完全合理的類型,所以函數可以擁有類型為函數指針的形參。進而,由這樣的函數來調用實參指向的函數。
例子:
[cpp]
#include <iostream>
using std::cout;
using std::endl;
double squared(double);
double cubed(double);
double sumarray(double array[], int len, double (*pfun)(double));
int main()
{
double array[] = {1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5};
int len(sizeof array/sizeof array[0]);
cout << endl << "Sum of Squared = " << sumarray(array, len, squared);
cout << endl << "Sum of cubed = " << sumarray(array, len, cubed);
cout << endl;
system("pause");
return 0;
}
double squared(double x)
{
return x*x;
}
double cubed(double x)
{
return x*x*x;
}
double sumarray(double array[], int len, double (*pfun)(double) )
{
double total(0.0);
for ( int i=0; i<len; ++i)
{
total += pfun(array[i]);
}
return total;
}
結果是:
(4)函數指針數組:
假設有三個函數:
double add(double, double);
double mul(double, double);
double div(double, double);
double (*pfun[3])(double, double) = {add, mul, div};
你可以這樣調用:
pfun[1](1.5, 5.5);