函數指針的用法

函數指針的用法

概要:本文描述的函數指針的一些使用方法。

關鍵字:函數指針、返回函數指針的函數

 

提到函數指針,一般我們能夠想到的用法如下。

 

1、 第一種,直接使用,比較原始的方式。


 

 

說明:首先,我們定義一個函數指針變量pFun,函數的原型是:int (*)(int n)即,該函數是一個參數爲整形,返回值是空值的函數。請注意我在這裏使用的措辭,pFun是一個“變量”,而非“類型”,那麼,既然是變量,它就應該能夠被賦值,能夠被初始化。因此,由於函數testFun1的參數與返回值與上面所描述的類型吻合,所以我們能夠對pFun進行賦值pFun = testFun1。然後使用函數指針進行調用,(*pFun)(1)。爲什麼可以這麼調用呢?我們需要理解:函數的函數名本質上就是一個指針,函數名指向該函數在內存中的首地址。就像int array[10]array就能代表數組首地址一樣。所以,表達式(*pFun)(1)表達的意思是先取pFun的值,得到testFun1的地址,然後再進行調用,與直接調用testFun1(1)沒有任何區別。

pFun(1)又是怎麼回事,爲什麼也能夠進行調用?爲什麼與(*pFun)(1)表達同一個意思?

以下說明解釋了爲什麼?在這裏引用了一位達人的鏈接,膜拜先,同時也灰腸感謝這位達人的文字指點。

http://blog.21ic.com/user1/3742/archives/2007/34818.html

 

 

 

如果你看明白了上面的描述,那麼應該很清楚的知道爲什麼了。呵呵。

 

2、 第二種,使用typedef的方式。

先說明一下typedef的作用,該關鍵字的目的是將一個已知的類型定義成一個新的類型,使用新的類型可能會具有更加明確的語義,或者使用更加方便。

如:typedef int INT; INT n = 100;

這種方式是如下定義的。

 

 

 

說明:這種方式與第一種唯一不同的就是使用了typedef,它爲函數的原型爲:int (*)(int n)的類型定義了一個新的名字(或稱爲類型),叫FUN,使用FUN定義一個變量pFunpFun就能代表一個函數指針,代表的函數原型就是int (*)(int n)pFun既然是一個變量,那麼其使用也就和前面所述的第一種方式無異了,這裏不再贅述。

 

3 第三種,在類中使用函數指針。

 

指針的定義加上了“類”限制, 指針的使用加上了的“對象”限制,用來指明指針指向的函數是哪個類的, 使用的時候是對象相關的.

個人感覺在類中使用函數指針沒有一點用處, 至少我現在不知道有啥用途. 


直到我在閱讀《STL源碼剖析》之前,我一直認爲函數指針的使用方式也就只有這麼多,但今天在讀這本書的時候,發現了以下奇怪的用法,見書:P57頁,代碼如下:

 

 

 

乍一看,不對呀,void ( *set_malloc_handle(void (*f)()) ) ()這個定義明明是返回一個空值啊,爲什麼返回的是一個函數指針,難道書出錯了?google了一下,終於明白是怎麼回事。原來函數指針還可以這麼用。

 

4、 第四種,定義返回函數指針的函數

return_type ( *function(func_parameter_list) ) (parameter_list)

 

說明:這裏定義了一個函數function,該函數的參數列表是(func_patameter_list),返回類型是一個函數指針,這個函數指針的原型是return_type (*)(parameter_list)

 

得之這種使用方式後,上面的源代碼我們就能夠明白到底是怎麼回事了。

 

因此:void ( *set_malloc_handle(void (*f)()) ) ()這個定義就是說,定義了一個函數set_malloc_handle,其參數是一個函數指針f,其原型是void (*)(),函數set_malloc_handle的返回值也是一個指針,其原型也是void (*)(),函數內部先將舊的函數指針保存起來,然後設置新的函數指針,最後將舊的函數指針返回出去。一目瞭然。

 

實際上,按照這種方式,看着總歸有些彆扭,感覺語義晦澀難懂,無非就是一個函數,它即能夠接收一個函數指針,又能夠返回一個函數指針,因此,完全可以按照以下方式來做:

 

 

 

這樣看起來是不是更加清晰了呢?呵呵。實際上,我查看了一下windowsSTL版本里面的定義,就是按照這種方式。代碼如下:

 

 

 

再看一個例子,以前我在剛學linux信號的時,沒怎麼搞明白,現在也一目瞭然了。

signal函數原型

 

 


本文參考鏈接:

1.  關於C++中函數指針的使用:

http://www.98exe.net/Article/a/2006-10-23/2025.html

2.  函數指針及其應用:

http://blog.21ic.com/user1/3742/archives/2007/34818.html

3.  定義返回函數指針的函數:

http://dev.firnow.com/course/3_program/c++/cppjs/20091012/178580.html

 

發佈了60 篇原創文章 · 獲贊 32 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章