Frage

Ist es möglich, einen Funktionszeiger als Argument für eine Funktion in C passieren?

Wenn ja, wie würde ich erklären und eine Funktion definieren, die einen Funktionszeiger als Argument?

War es hilfreich?

Lösung

Auf jeden Fall.

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

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

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

Andere Tipps

Lassen Sie uns sagen, Sie haben Funktion

int func(int a, float b);

So Zeiger auf es sein wird,

int (*func_pointer)(int, float);

So, als Sie es so verwenden könnte

  func_pointer = func;
  (*func_pointer)(1, 1.0);

  /*below also works*/
  func_pointer(1, 1.0);

Um zu vermeiden, Angabe Voll Zeiger jedes Mal, geben Sie es brauchen Sie coud es typedef

typedef int (*FUNC_PTR)(int, float);

und als Verwendung 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 schlage vor, Blick auf die weltbekannte C faqs .

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'

Überprü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 nennen, die Ausführung „die Bibliothek geht in“ und „Schritte in Ihren eigenen Code sichern“ durch die Verwendung dieser Zeiger.

, sagte Wie schon in anderen Antworten, 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 für die Erklärung ein Arguments von Funktionszeigertyp ein Sonderfall ist: Wenn ein Argument den Funktionstyp hat, wird es in einen Zeiger auf den Funktionstyp umgewandelt werden, genau wie Arrays Zeiger in Parameterlisten umgewandelt werden, so Ersteres kann auch geschrieben werden

void qsort(void *base, size_t nmemb, size_t size,
           int compar(const void *, const void *));

Natürlich gilt dies für nur Parameter, wie außerhalb einer Parameterliste int compar(const void *, const void *); würde eine Funktion deklarieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top