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