回調函數 與函數指針

函數指針的定義:返回值類型 ( * 指針變量名) (形參列表);

1:"返回值類型"說明函數的返回類型,"(指針變量名 )"中的括號不能省,括號改變了運算符的優先級。若省略整體則成爲一個函數說明,說明了一個返回的數據類型是指針的函數,後面的"形參列表"表示指針變量指向的函數所帶的參數列表。

int func(int x); /* 聲明一個函數 */

int (*f) (int x); /* 聲明一個函數指針 */

f=func; /* 將func函數的首地址賦給指針f */

或者使用下面的方法將函數地址賦給函數指針:

f = &func;

賦值時函數func不帶括號,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。

注意:以後就可以用f來調用該函數,實際上f和func都指向同一個入口地址,不同就是f是一個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎麼做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而後用指針變量調用它,因此可以先後指向不同的函數。不過,指向函數的指針沒有++和--運算,用時要小心。


回調:軟件模塊之間總是存在着一定的接口,從調用方式上,可以把他們分爲三類:同步調用、回調和異步調用。同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。回調和異步調用的關係非常緊密,通常我們使用回調來實現異步消息的註冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎。

回調函數作用:客戶和服務的交互除了同步方式以外,都需要具備一定的異步通知機制,讓服務方(或接口提供方)在某些情況下能夠主動通知客戶,而回調是實現異步的一個最簡捷的途徑。

eg:網絡,I/O操作,文件操作(Linux下一切皆文件:磁盤,網卡,顯示器)

回調兩種實現:

1.對於一般的結構化語言,可以通過回調函數來實現回調。回調函數也是一個函數或過程,不過它是一個由調用方自己實現,供被調用方使用的特殊函數。

2.在面向對象的語言中,回調則是通過接口或抽象類來實現的,我們把實現這種接口的類成爲回調類,回調類的對象成爲回調對象。對於象C++或Object Pascal這些兼容了過程特性的對象語言,不僅提供了回調對象、回調方法等特性,也能兼容過程語言的回調函數機制。

Windows平臺的消息機制也可以看作是回調的一種應用,我們通過系統提供的接口註冊消息處理函數(即回調函數),從而實現接收、處理消息的目的。


回調函數:在計算機程序設計中,回調函數,或簡稱回調,是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。

回調函數的使用機制:

⑴定義一個回調函數;

⑵提供函數實現的一方在初始化的時候,將回調函數的函數指針註冊給調用者;

⑶當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。

回調函數的作用:因爲可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個特定原型和限制條件的被調用函數。

回調函數相關圖解

wKiom1crNbaQpxpHAAA5YpfmYno093.png

wKiom1crNbbieQZvAABR5r5lTF4310.png



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