Ist es möglich, einen Funktionszeiger als Argument an eine Funktion in C zu übergeben?
Wenn ja, wie würde ich eine Funktion deklarieren und definieren, die einen Funktionszeiger als Argument verwendet?
Bestimmt.
void f(void (*a)()) {
a();
}
void test() {
printf("hello world\n");
}
int main() {
f(&test);
return 0;
}
Angenommen, Sie haben eine Funktion
int func(int a, float b);
Also Zeiger darauf wird es sein
int (*func_pointer)(int, float);
Also, als könntest du es so gebrauchen
func_pointer = func;
(*func_pointer)(1, 1.0);
/*below also works*/
func_pointer(1, 1.0);
Um zu vermeiden, dass Sie jedes Mal den vollständigen Zeigertyp angeben, wenn Sie ihn benötigen, können Sie ihn mit typedef
abrufen
typedef int (*FUNC_PTR)(int, float);
und als wie jeder andere Typ verwenden
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 schlage vor, die weltberühmten C faqs anzuschauen.
Dies ist ein gutes Beispiel:
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()
{
printf("%i,%i", mathOp(sum, 10, 12), mathOp(div, 10, 2));
return 0;
}
The output is : '22, 5'
Wie bereits in anderen Antworten erwähnt, können Sie dies wie in
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Es gibt jedoch einen Sonderfall für die Deklaration eines Arguments des Funktionszeigertyps: Wenn ein Argument den Funktionstyp hat, wird es in einen Zeiger auf den Funktionstyp konvertiert, genau wie Arrays in Zeiger in Parameterlisten konvertiert werden kann auch geschrieben werden als
void qsort(void *base, size_t nmemb, size_t size,
int compar(const void *, const void *));
Dies gilt natürlich nur für Parameter, da außerhalb einer Parameterliste int compar(const void *, const void *);
eine Funktion deklarieren würde.
Überprüfe qsort()
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Das letzte Argument für die Funktion ist ein Funktionszeiger. Wenn Sie qsort()
in einem Ihrer Programme aufrufen, wird die Ausführung "in die Bibliothek gehen" und "durch Verwendung dieses Zeigers in Ihren eigenen Code zurückkehren".