函數指針就是指向函數的指針,和其他指針一樣,函數指針也有類型
函數指針的類型由函數的返回值和函數的形參共同決定,與函數名無關,因爲只是個名字
比如,函數的聲明如下:
int funcpointer(double d, string str);
那麼函數的類型就是int(double, string),所以函數指針就是int (*pf)(double, string)
函數指針的讀法依然是先中間,然後兩邊,
先看到pf和*,知道這是個指針,看到右側的(double, string),知道這是形參列表,從而瞭解該指針指向了一個函數,最後看左邊int,知道指向的函數返回值是int
pf兩邊的括號必不可少,如果沒有,那麼pf就是函數名,返回一個int型指針
函數指針的初始化和賦值
可以直接用函數名給函數指針賦值或初始化,或者在函數名前面加上取地址符號
void testfuncp()
{
int(*pf)(double, string)=funcpointer;
int(*pf2)(double,string);
pf2=funcpointer;
pf(3.14, "asd");
*pf2(2.2,"qwe");
}
int funcpointer(double d, string str)
{
cout<<__func__<<endl;
}
以上代碼還顯示,可以通過函數指針直接調用函數,而不用解引用,當然,用瞭解引用符也沒什麼
當給一個函數指針賦值或者初始化時,函數類型必須匹配,否則報錯
void testfuncperror()
{
int(*pf)(double, string)=testfuncp;
}
void testfuncp()
{
int(*pf)(double, string)=funcpointer;
int(*pf2)(double,string);
pf2=funcpointer;
pf(3.14, "asd");
pf2(2.2,"qwe");
}
函數指針的作爲形參
函數指針作爲形參時,傳入的函數會被當做指針處理
int main(int argc, char const *argv[])
{
testfuncpointerpara(twointfunc);
return 0;
}
void testfuncpointerpara(void (*pf)(int, int))
{
cout<<__func__<<endl;
pf(10,20);
}
void twointfunc(int a, int b)
{
cout<<__func__<<endl;
}
返回函數指針
返回函數指針的函數可以按照如下方式進行聲明
int (*returnfuncpointer(int a, int b))(int c, int d);
讀法依然是先中間,再右,最後左
看中間*returnfuncpointer(int a, int b),知道returnfuncpointer是一個函數,返回的是指針,再看右邊有形參列表,知道返回的是函數指針,最後看左邊int,知道這個函數指針的指向的函數的返回值是int
int main(int argc, char const *argv[])
{
int a=10,b=20;
int (*pf)(int, int)=returnfuncpointer(a,b);
pf(a,b);
return 0;
}
int (*returnfuncpointer(int a, int b))(int c, int d)
{
cout<<__func__<<endl;
return func;
}
int func(int a, int b)
{
cout<<a+b<<endl;
return a+b;
}
上述代碼中的函數returnfuncpointer返回一個類型爲int (*)(int a, int b)的函數指針,首先用該函數的返回值初始化pf,然後通過pf調用函數func
參考:
《C++ Primer》
歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出