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?
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?
Definitiv.
void f(void (*a)()) {
a();
}
void test() {
printf("hello world\n");
}
int main() {
f(&test);
return 0;
}
Ich schlage vor, auf der weltberühmten C faqs
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 .
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.
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'
Ändern der Aufruf von f (Test); –
Beide werden funktionieren. Das kaufmännische Und ist optional. Wenn Sie also den Funktionszeiger aufrufen, wird der Zeiger dereferenziert. –
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