Funktionszeiger als Argument

Lesezeit: 3 Minuten

Benutzeravatar von inquisitive
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?

  • Ich schlage vor, sich die weltberühmten anzuschauen C-FAQs

    – Lorenzog

    24. November 2009 um 12:39 Uhr

Benutzeravatar von mmx
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

Benutzeravatar von Michal Sznajder
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_закалённый в боюs Benutzeravatar
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”.

1409170cookie-checkFunktionszeiger als Argument

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy