C++筆記:函數指針
[P238, C++ Primer, 7.9]
函數與函數指針
在C++中,直接使用一個函數名很可能會被自動轉換為使用該函數的指針。
// 使用函數名等價於使用函數的指針。
void sub()
{
}
int main()
{
sub();
(&sub)(); // 實質和上一行相同。
void (*psub)();
psub = sub;
psub(); // 實質相同。
}
類似的,傳遞函數形參時,定義為傳遞函數和傳遞函數指針是等價的。
void sub(int (int))
{
}
void _sub(int (*)(int))
{
}
int sub3(int a)
{
return a;
}
int main()
{
sub(sub3);
_sub(sub3); //等價
}
定義返回值是函數指針的函數
普通的定義方法顯得非常晦澀難懂。試圖理解以下函數原型:
int * (*ff(int))(int*,int);
它的含義是:定義一個函數 ff,帶有一個 int 類型的形參。其返回值為 int ()(int*, int),即返回一個帶有 (int*,int) 的形參類型並返回 int * 類型的函數指針。 注意:對於該原型中的第二個 ,如果修改為 ()ff(int),含義就改變為 ff(int)本身成為了函數指針。由於沒有帶括號,ff(int) 只是普通函數,* 修飾的含義是表明其返回值為指針類型。 所以我們有必要對這樣晦澀難懂的返回函數指針的函數進行簡化。方法是使用萬能的 typedef。
typedef int * (*pfun)(int*, int);
pfun ff(int);
指向重載函數的指針
使用這種指針時,必須注意,指針一定要和某一重載版本的函數完全對應。否則,對該指針的賦值將產生編譯時錯誤。
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。