之前在書上看到函數(shù)指針相干的都沒怎樣重視,但是最近在實(shí)際的工作中卻派上了用處。所以認(rèn)真地學(xué)習(xí)了1遍。
申明1個函數(shù)指針很簡單,就是將函數(shù)申明中的函數(shù)名替換為1個指針便可:
int test(int para1, double *para2); // 函數(shù)申明
int (*pf)(int para1, double *para2); // 函數(shù)指針申明
NOTE: 必須在申明中用括號將
*pf
括起來,由于括號的優(yōu)先級比*
運(yùn)算符高,因此:C/C++int (*pf)(int para1, double *para2); // 1個指向函數(shù)的指針 int *pf(int para1, double *para2); // 1個返回指針的函數(shù)
申明完函數(shù)指針的下1步就是對函數(shù)指針賦值,也就是將函數(shù)指針指向1個類型匹配的函數(shù)(這跟基本類型的指針1致),1個函數(shù)的函數(shù)名就是該函數(shù)的地址
:
pf = test;
int (*pf1)(int para1, double *para2) = test; // 也能夠在函數(shù)指針申明時完成初始化
C++11有了自動類型推斷功能,就簡單了很多:
auto pf = test;
(*pf)
扮演的角色與函數(shù)名相同,因此使用(*pf)
時,只需要將它看作函數(shù)名便可:
int n = 0;
double d = 0.0;
int r = 0;
r = (*pf)(n, &d);
r = pf(n, &d); // 這類方式C/C++也是允許的
我們有可能還需要用到函數(shù)指針數(shù)組,示例以下:
int test1(int para1, double *para2); // 函數(shù)申明
int test2(int para1, double *para2); // 函數(shù)申明
int test3(int para1, double *para2); // 函數(shù)申明
int (*pfArray[3])(int para1, double *para2) = {test1, test2, test3}; // 函數(shù)指針數(shù)組申明及初始化
r = *pfArray[0](n, &d); // 函數(shù)調(diào)用
可以看到這類方式使用函數(shù)指針是比較麻煩的,試想如果上面的函數(shù)返回值是const指針,而我們又想將函數(shù)指針數(shù)組申明為不可更改的,那這個const
應(yīng)當(dāng)加到哪?這里提供另外1個比較簡單的解決方法,也就是下面將要說到的使用typedef進(jìn)行簡化。
typedef int (*p_fun)(int para1, double *para2); // 這樣我們就可以像使用1個普通類型那樣來使用函數(shù)指針了
p_fun pf = test;
const p_fun pf1 = test; // 常量函數(shù)指針申明及初始化,注意跟1般的const數(shù)據(jù)類型1樣,常量函數(shù)指針必須在申明時完成初始化
p_fun pfArray[3] = {test1, test2, test3};
const p_fun pfArray1[3] = {test1, test2, test3}; // 常量函數(shù)指針數(shù)組申明及初始化
It's that easy!
參考書籍:《C++ Primer Plus (第6版)中文版》