C++知識點10——函數指針

函數指針就是指向函數的指針,和其他指針一樣,函數指針也有類型

函數指針的類型由函數的返回值和函數的形參共同決定,與函數名無關,因爲只是個名字

 

比如,函數的聲明如下:

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》

 

歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章