二、C語言裡的函式指標
上一節裡介紹了回撥函式,模組A提供了該函式 然後模組A呼叫B B再返過來呼叫A提供的函式,再處理最後返回結果給A。暈了。還是畫個圖。一般呼叫情況:
圖2-1
有回撥函式的呼叫情況:
圖2-2
這個過程既然清楚了,那麼回撥函式如何傳給模組B,它和一般的引數不同,它是一個函式。在C語言裡解決的方案是函式指標,所謂函式指標字面上也可以理解 即指向函式的指標。函式指標更詳細的用法可以參見譚浩強老師編寫的經典著作《C程式設計(第二版)》(好書啊)。比如上例中的MyBestChoice的函式宣告是:
Ticket* MyBestChoice(Ticket[] ticketArray,int count)
輸入引數是滿足條件的票的陣列和陣列個數,返回的是最佳的票。那麼函式指標的宣告是
Ticket* (*p)(Ticket[] ticketArray,int count);
當然p可以直接指向MyBestChoice的函式p = MyBestChoice;函式指標還有一個很重要的特性是函式指標可以指向任何形參相同的函式,比如:
Ticket* 票販子(Ticket[] ticketArray,int count)很多票,然後以高價買給你,通常返回值不為空。
Ticket* 火車站(Ticket[] ticketArray,int count)很多票,然後以正常價買給你,通常返回空。
這兩個函式都可以用p指向,即p = 火車站;p = 票販子。
不要小看這個特性,因為有了這個特性,可以對不同的函式實現統一的操作,請好好再比較一下例1-1和例1-2。
那麼B模組想傳遞迴調函式,那麼他的最後一個形參要寫成函式指標的形式。如下:
B(Time,StartCity,EndCity,Ticket* (*p)(Ticket[] ticketArray,int count))