天天看點

函數指針,回調函數

函數指針的定義:傳回值類型 ( * 指針變量名) (形參清單);

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平台的消息機制也可以看作是回調的一種應用,我們通過系統提供的接口注冊消息處理函數(即回調函數),進而實作接收、處理消息的目的。

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

回調函數的使用機制:

⑴定義一個回調函數;

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

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

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

繼續閱讀