Aufrufe mit Funktionspointern
-
Hallo, ich hätte mal eine Frage zu Funktionspointern. Und zwar sieht mein Quelltext so aus:
typedef double (*t_pfnct_math)(double x); void math (t_pfnct_math pf) { double xi = 0.0; for (xi = 1.0; xi <= 10.0; xi = xi+1.0) { printf ("xi = %.1f \t| ", xi); printf ("%+.3f |\n", (*pf)(xi)); /* .... wenn man hier diesen Aufruf macht? */ } } int main(void) { printf ("sin(x)\n"); math(&sin); /* Frage: Warum ist das hier erlaubt, wenn: Siehe oben */ printf ("cos(x)\n"); math(cos); /* Warum geht dieser Aufruf trotzdem gut? Welche Form des Aufrufes wird empfohlen? */ return 0; }
Es gibt hier bei beiden Aufrufen korrekt den Sinus und den Cosinus aus. Die Fragen stehen ja schon in den Kommentaren im Quelltext. Warum funktioniert beides und welche Form wird eher verwendet?
Vielen Dank schonmal für eine Antwort
Liebe Grüße
-
Es ist schlicht beides erlaubt. Der Name einer Funktion wird implizit in einen Zeiger auf die Funktion konvertiert, außer es handelt sich um einen Aufruf dieser Funktion (oder eben wenn der Adressoperator drauf angewendet wird). So ähnlich wie bei Arrays. Beide Schreibweisen habe ich schon gesehen und da beide eigentlich recht deutlich ausdrücken, was passiert, sehe ich auch keinen speziellen Vorteil oder Nachteil für eine der Schreibweisen.
Beim Aufruf kannst du übrigens auch verschiedene Schreibweisen benutzen
(*pf)(xi)
, wie bei dir, oder kurzpf(xi)
.