web-dev-qa-db-de.com

Funktionszeiger als Argument

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?

39
inquisitive

Bestimmt.

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

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

int main() {
     f(&test);
     return 0;
}
67
Mehrdad Afshari

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.

25
Michal Sznajder

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'
10
BattleTested

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.

2
Antti Haapala

Ü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".

2
pmg