2009-11-24 17 views
24

Ist es möglich, einen Funktionszeiger als Argument an eine Funktion in C zu übergeben?Funktionszeiger als Argument

Wenn ja, wie würde ich eine Funktion deklarieren und definieren, die einen Funktionszeiger als Argument nimmt?

Antwort

49

Definitiv.

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

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

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

Ändern der Aufruf von f (Test); –

+6

Beide werden funktionieren. Das kaufmännische Und ist optional. Wenn Sie also den Funktionszeiger aufrufen, wird der Zeiger dereferenziert. –

+0

Wahr, es ist nicht nötig, etwas zu ändern. Darüber hinaus ist auch die "Pointer" -Syntax in der Parameterdeklaration optional. Das obige 'f' könnte als' void f (void a()) 'deklariert worden sein. – AnT

20

Let suchen sagen, Sie haben Funktion

int func(int a, float b); 

So Zeiger darauf

int (*func_pointer)(int, float); 

So sein als Sie nutzen könnten es ist so

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

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

Um zu vermeiden, volle Zeigertyp Angabe jedes Mal, wenn Sie es brauchen Sie es

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

typedef coud und als verwenden wie jede andere Art

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

ich an der weltbekannten empfehlen suchen C faqs .

2

prüfen qsort()

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

Das letzte Argument der Funktion ist ein Funktionszeiger. Wenn Sie qsort() in einem Programm von Ihnen aufrufen, geht die Ausführung "in die Bibliothek" und "springt zurück in Ihren eigenen Code" durch die Verwendung dieses Zeigers.

5

ein gutes Beispiel:

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

Ausgabe ist: '22, 5'

Verwandte Themen