2009-11-24 30 views
24

È possibile passare un puntatore a funzione come argomento a una funzione in C?Puntatore funzione come argomento

Se sì, come dovrei dichiarare e definire una funzione che accetta un puntatore di funzione come argomento?

risposta

49

Definitivamente.

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

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

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

modificare la chiamata di f (test); –

+6

Entrambe funzioneranno. La e commerciale è opzionale. Quindi è il dereferenziamento del puntatore quando si chiama il puntatore della funzione. –

+0

È vero, non è necessario cambiare nulla. Inoltre, anche la sintassi "pointer" nella dichiarazione dei parametri è opzionale. Il precedente 'f' potrebbe essere stato dichiarato come' void f (void a()) '. – AnT

20

Diciamo che avete funzione

int func(int a, float b); 

Così puntatore ad esso sarà

int (*func_pointer)(int, float); 

di quanto si potrebbe usare è così

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

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

Per evitare di specificare pieno tipo di puntatore ogni volta che ne avete bisogno si coud typedef che

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

e di utilizzare come qualsiasi altro tipo

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) 
} 

Suggerisco di guardare il mondo-famoso C faqs .

2

check qsort()

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

L'ultimo argomento della funzione è un puntatore a funzione. Quando chiami qsort() in un tuo programma, l'esecuzione "entra nella libreria" e "ritorna nel tuo codice" attraverso l'uso di quel puntatore.

5

un buon esempio:

#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; 
} 

uscita è: '22, 5'

Problemi correlati