2009-11-24 114 views
24

是否可以將函數指針作爲參數傳遞給C中的函數?函數指針作爲參數

如果是這樣,我將如何聲明和定義一個函數指針作爲參數的函數?

回答

49

當然。

void f(void (*a)()) { 
    a(); 
} 

void test() { 
    printf("hello world\n"); 
} 

int main() { 
    f(&test); 
    return 0; 
} 
+3

改變呼叫至f(試驗); –

+6

兩者都有效。 &符是可選的。所以,當你調用函數指針時,解除引用指針。 –

+0

沒錯,沒有必要改變任何東西。而且,即使參數聲明中的「指針」語法也是可選的。上面的'f'可以被聲明爲'void f(void a())'。 – AnT

20

讓說你有功能

int func(int a, float b); 

所以指針將是

int (*func_pointer)(int, float); 

所以比你可以使用它就像這樣

func_pointer = func; 
    (*func_pointer)(1, 1.0); 

    /*below also works*/ 
    func_pointer(1, 1.0); 

要避免每次你需要它的時候指定全指針式你coud typedef

typedef int (*FUNC_PTR)(int, float); 

,比使用像任何其他類型的

void executor(FUNC_PTR func) 
{ 
    func(1, 1.0); 
} 

int silly_func(int a, float b) 
{ 
    //do some stuff 
} 

main() 
{ 
    FUNC_PTR ptr; 
    ptr = silly_func; 
    executor(ptr); 
    /* this should also wotk */ 
    executor(silly_func) 
} 

我建議在看世界著名的C faqs

2

檢查qsort()

void qsort(void *base, size_t nmemb, size_t size, 
      int (*compar)(const void *, const void *)); 

的最後一個參數的函數是一個函數指針。當您在您的程序中調用qsort()時,通過使用該指針,執行「進入庫」並「退回到您自己的代碼中」。

5

一個很好的例子:

#include <iostream> 
using namespace std; 

int sum(int a, int b) 
{ 
    return a + b; 
} 

int mul(int a, int b) 
{ 
    return a * b; 
} 

int div(int a, int b) 
{ 
    return a/b; 
} 

int mathOp(int (*OpType)(int, int), int a, int b) 
{ 
    return OpType(a, b); 
} 

int main() 
{ 

    cout << mathOp(sum, 10, 12) << ", " << mathOp(div, 10, 2) << endl; 
    return 0; 
} 

輸出是:'22,5'