什么是函數(shù)指針
前面一篇文章我們講解了C/C++中關(guān)于指針的用法,但是當(dāng)時(shí)局限的是對(duì)變量的指針,對(duì)函數(shù)這塊并未講解,其實(shí)函數(shù)也是有地址的。
在程序中定義一個(gè)函數(shù),則編譯時(shí)系統(tǒng)就會(huì)為這段代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的首地址稱為函數(shù)的地址,且函數(shù)名代表的就是這個(gè)地址。既然是地址就可以使用一個(gè)指針變量來存儲(chǔ)這個(gè)地址,這個(gè)指針變量就就叫做函數(shù)指針。
函數(shù)指針變量定義方式和普通的變量指針定義方式有一定區(qū)別:
格式:
函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);
例如:int (*p)(int,int)
這段代碼就定義了一個(gè)函數(shù)指針變量p,可以用來存儲(chǔ)函數(shù)的首地址(一般直接使用函數(shù)名代替),該函數(shù)類型為帶兩個(gè)int形參以及返回值類型為int。
注意:
(*指針變量名)這個(gè)括號(hào)不能省略,如果寫成了int *p(int,int),那就不是一個(gè)函數(shù)指針了,而是一個(gè)返回值類型為一個(gè)int型指針的函數(shù)p。
那么怎么判斷一個(gè)指針變量是指向變量的指針變量還是指向函數(shù)的指針變量呢?
- 1.首先看變量名前面有沒有“ ”,如果有“ ”說明是指針變量;
- 2.其次看變量名的后面有沒有帶有形參類型的圓括號(hào),如果有就是指向函數(shù)的指針變量,即函數(shù)指針,如果沒有就是指向變量的指針變量。
另外也可以使用引用的方式進(jìn)行定義:
例如:int (*p)(int,int)使用int (&p)(int,int)來定義,讀者可以自己去試試。
如何使用函數(shù)指針
-
1.作為指針變量進(jìn)行賦值調(diào)用 代碼如下:
int max(int x, int y) { return x >= y ? x : y; } int min(int x, int y) { return x >= y ? y : x; } void extendsTest::mainTest() { int a = 10, b = 20; int (*p)(int, int); p = max; cout << p(a, b) << endl; p = min; cout << p(a, b) << endl; }; 運(yùn)行結(jié)果: 20 10
-
2.作為參數(shù)進(jìn)行函數(shù)回調(diào)
大部分情況下在代碼中函數(shù)指針是被用來函數(shù)回調(diào)使用,也就是作為參數(shù)傳遞。
代碼如下:
int max(int x, int y) { return x >= y ? x : y; } int min(int x, int y) { return x >= y ? y : x; } //指針形式 void func(int& a,int& b,int (*p)(int,int)) { cout << p(a, b) << endl; } //引用形式 void func1(int& a, int& b, int (&p)(int, int)) { cout << p(a, b) << endl; } void extendsTest::mainTest() { int a = 10, b = 20; func(a, b, max); func(a, b, min); }; 運(yùn)行結(jié)果: 20 10
本例中將函數(shù)指針作為另外一個(gè)函數(shù)的參數(shù)傳入,在函數(shù)內(nèi)部調(diào)用函數(shù)指針指向的函數(shù),實(shí)現(xiàn)了一個(gè)函數(shù)內(nèi)部回調(diào)的方式,寫Java的同學(xué)是不是很熟悉呢?
知識(shí)拓展
指針是 C/C++的精華,也是 C/C++的難點(diǎn),沒學(xué)會(huì)指針就是沒學(xué)會(huì) C/C++。如果你覺得函數(shù)指針還能勉強(qiáng)接受的話,可以嘗試?yán)斫庖恍└鼜?fù)雜的指針,例如:
char *(* c[1])(char **p);
char (*(*(*p)(char *))[1])(char *);
以上兩個(gè)案例如果都能看懂的話,那么99%以上指針都難不倒你了。
-
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81049 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73651
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論