2011-09-02 69 views
3

最近我在一次採訪中被問到:我們可以在C中使用函數指針嗎? 什麼函數指針返回。我說使用我們可以使用函數指針調用函數,然後他問了一些例子,但我不能滿足他更多的例子。然後他問我什麼函數指針返回。我告訴他,這取決於函數指針的聲明。我們在哪裏可以使用C中的函數指針,函數指針有什麼用處

但我真的想知道函數指針的一些用途中C.

+2

請看看這個文件:http://c-faq.com/~scs/cclass/int/sx10b.html – adatapost

+0

這個問題已被多次詢問本網站。使用搜索功能,你會發現像http://stackoverflow.com/questions/2592137/what-is-the-point-of-function-pointers – Lundin

回答

14

我認爲C中的經典例子是qsort。從那裏引用(我知道這是http://www.cplusplus.com,所以不是非常好的網站,但它似乎是正確的)是比較兩個元素

void qsort (void * base, size_t num, size_t size, int (* comparator) (const void *, const void *)); 

功能。該功能應遵循這個原型:

int comparator (const void * elem1, const void * elem2); 

函數必須接受兩個參數是指向元素類型鑄造爲void *。這些參數應該轉換回某種數據類型並進行比較。

該函數的返回值應該通過分別返回負值,零值或正值來表示elem1是否被認爲小於,等於或大於elem2。


其他「經典」的例子是計算器(例如,參見this,這是C++,但它在C相同)。

你有四個數學函數,例如

float Plus (float a, float b) { return a+b; } 
float Minus (float a, float b) { return a-b; } 
float Multiply(float a, float b) { return a*b; } 
float Divide (float a, float b) { return a/b; } 

以某種方式選擇了您的操作

/* Here there should be an if or a switch/case that selects the right operation */ 
float (*ptrFunc)(float, float) = Plus; 

,你可以在以後調用它(由於某種原因,你不想打電話它可以直接在if/switch中,也許是因爲您想要製作其他「常見」操作,例如記錄或打印結果)

float result = ptrFunc(1.0f, 2.0f); 

另兩件事情,你可以使用函數指針的回調(如寫vine'th)和「窮人」虛函數(你把它們放在一個struct,當你創建struct(你知道,就像使用「窮人」的構造函數,但這是C,所以我們將它稱爲初始值設定項),那麼你可以在那裏保存那個函數將被那個struct使用)。

+0

+1這樣的線索是爲什麼函數指針是有用的一個很好的例子。 –

4

如果你沒有繼承/班等,你可以模擬與C.例如呼叫根據一些條件不同的功能。

您還可以將函數指針作爲參數放到其他函數中。例如,如果你有一個排序算法,你可以通過函數指針提供一個比較函數。

是的,你是正確的返回值。這取決於定義。

2

函數指針用於異步通知,例如,一般範例是傳遞一個函數指針和一個回調數據,這些數據將被庫調用。你可以在glib mainloop中看到一個例子;在C++ STL中,你可以看看廣泛使用的functors,函數指針是一個函子。

0

當我想到使用函數指針時,我想從使用通用代碼的調用中將它們用於特定或自定義的代碼。

考慮qsort()。這是一種通用的排序算法。使用函數指針來比較元素允許用戶將qsort()自定義爲其特定的數據類型。

考慮文件系統。大多數系統使用虛擬文件系統框架來處理它們。該框架提供了通用功能。爲了處理差異,框架通過函數指針調出文件系統特定的代碼。