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?
neugierig
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?
mmx
Definitiv.
void f(void (*a)()) {
a();
}
void test() {
printf("hello world\n");
}
int main() {
f(&test);
return 0;
}
Beides wird funktionieren. Das kaufmännische Und ist optional. Dies gilt auch für die Dereferenzierung des Zeigers, wenn Sie den Funktionszeiger aufrufen.
– mmx
24. November 2009 um 13:05 Uhr
Stimmt, da muss nichts geändert werden. Darüber hinaus ist sogar die “Zeiger”-Syntax in der Parameterdeklaration optional. Obenstehendes f
hätte deklariert werden können void f(void a())
.
– AnT steht zu Russland
24. November 2009 um 14:57 Uhr
Die Verwendung einer Typedef für den Typ des Funktionszeigers könnte den Code leichter lesbar machen.
– David R. Tribble
24. November 2009 um 20:15 Uhr
Gibt es eine Möglichkeit, einen Zeiger auf eine Funktion mit vordefiniertem Wert einer der Eingaben zu haben? Sagen wir, wir haben void f( float * data, float funParam)
. Können wir einen Zeiger auf die Funktion mit einem bestimmten Wert von haben? funParam
?
– Royi
5. September 2018 um 22:19 Uhr
@Royi nein. Siehe auch stackoverflow.com/questions/4393716/…
– Antti Haapala – Слава Україні
9. März 2019 um 7:23 Uhr
Michal Sznajder
Nehmen wir an, Sie haben Funktion
int func(int a, float b);
Also Zeiger darauf wird sein
int (*func_pointer)(int, float);
Also könntest du es so verwenden
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 Folgendes tun: typedef
es
typedef int (*FUNC_PTR)(int, float);
und dann 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, sich die weltberühmten anzuschauen C-FAQs.
BattleTested_закалённый в бою
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 in anderen Antworten gesagt, können Sie es wie in tun
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 vom Typ Funktionszeiger: Wenn ein Argument den Typ Funktion hat, wird es in einen Zeiger auf den Funktionstyp konvertiert, genau wie Arrays in Parameterlisten in Zeiger konvertiert werden, also ersteres 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 *);
würde eine Funktion deklarieren.
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 du anrufst qsort()
In einem Ihrer Programme geht die Ausführung durch die Verwendung dieses Zeigers “in die Bibliothek” und “geht zurück in Ihren eigenen Code”.
Ich schlage vor, sich die weltberühmten anzuschauen C-FAQs
– Lorenzog
24. November 2009 um 12:39 Uhr