什么是函數(shù)指針
前面一篇文章我們講解了C/C++中關于指針的用法,但是當時局限的是對變量的指針,對函數(shù)這塊并未講解,其實函數(shù)也是有地址的。
在程序中定義一個函數(shù),則編譯時系統(tǒng)就會為這段代碼分配一段存儲空間,這段存儲空間的首地址稱為函數(shù)的地址,且函數(shù)名代表的就是這個地址。既然是地址就可以使用一個指針變量來存儲這個地址,這個指針變量就就叫做函數(shù)指針。
函數(shù)指針變量定義方式和普通的變量指針定義方式有一定區(qū)別:
格式:
函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);
例如:int (*p)(int,int)
這段代碼就定義了一個函數(shù)指針變量p,可以用來存儲函數(shù)的首地址(一般直接使用函數(shù)名代替),該函數(shù)類型為帶兩個int形參以及返回值類型為int。
注意:
(*指針變量名)這個括號不能省略,如果寫成了int *p(int,int),那就不是一個函數(shù)指針了,而是一個返回值類型為一個int型指針的函數(shù)p。
那么怎么判斷一個指針變量是指向變量的指針變量還是指向函數(shù)的指針變量呢?
- 1.首先看變量名前面有沒有“ ”,如果有“ ”說明是指針變量;
- 2.其次看變量名的后面有沒有帶有形參類型的圓括號,如果有就是指向函數(shù)的指針變量,即函數(shù)指針,如果沒有就是指向變量的指針變量。
另外也可以使用引用的方式進行定義:
例如:int (*p)(int,int)使用int (&p)(int,int)來定義,讀者可以自己去試試。
如何使用函數(shù)指針
-
1.作為指針變量進行賦值調(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; }; 運行結果: 20 10
-
2.作為參數(shù)進行函數(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); }; 運行結果: 20 10
本例中將函數(shù)指針作為另外一個函數(shù)的參數(shù)傳入,在函數(shù)內(nèi)部調(diào)用函數(shù)指針指向的函數(shù),實現(xiàn)了一個函數(shù)內(nèi)部回調(diào)的方式,寫Java的同學是不是很熟悉呢?
知識拓展
指針是 C/C++的精華,也是 C/C++的難點,沒學會指針就是沒學會 C/C++。如果你覺得函數(shù)指針還能勉強接受的話,可以嘗試理解一些更復雜的指針,例如:
char *(* c[1])(char **p);
char (*(*(*p)(char *))[1])(char *);
以上兩個案例如果都能看懂的話,那么99%以上指針都難不倒你了。
-
程序
+關注
關注
116文章
3756瀏覽量
80751 -
函數(shù)
+關注
關注
3文章
4277瀏覽量
62323 -
C++
+關注
關注
21文章
2100瀏覽量
73453
發(fā)布評論請先 登錄
相關推薦
評論