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);

指向重載函數的指針

使用這種指針時,必須注意,指針一定要和某一重載版本的函數完全對應。否則,對該指針的賦值將產生編譯時錯誤。

当前页阅读量为: