2009-11-24 11 views

Répondre

49

Certainement.

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

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

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

Changer l'appel à f (test); –

+6

Les deux vont fonctionner. L'esperluette est facultative. Donc déréférencer le pointeur lorsque vous appelez le pointeur de fonction. –

+0

Certes, il n'y a pas besoin de changer quoi que ce soit. De plus, même la syntaxe "pointeur" dans la déclaration des paramètres est facultative. Le 'f' ci-dessus aurait pu être déclaré comme' void f (void a()) '. – AnT

20

Disons que vous avez la fonction

int func(int a, float b); 

pointeur Donc il sera

int (*func_pointer)(int, float); 

Alors que vous pouvez utiliser comme ça

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

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

Pour éviter de déterminer le type plein pointeur à chaque fois que vous en avez besoin vous coud typedef il

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

et que l'utilisation comme tout autre type

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

Je suggère de regarder le monde célèbre C faqs .

2

Vérifier qsort()

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

Le dernier argument de la fonction est un pointeur de fonction. Lorsque vous appelez qsort() dans un de vos programmes, l'exécution "entre dans la bibliothèque" et "revient dans votre propre code" grâce à l'utilisation de ce pointeur.

5

un bon exemple:

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

sortie est: '22, 5'