Funktionszeiger
Willemers Informatik-Ecke
Funktionen nehmen Raum im Speicher ein und haben demzufolge eine Adresse. Die Adresse von Funktionen kann in Variablen gespeichert werden. Über die gespeicherten Adressen lassen sich die Funktionen später aufrufen. Solche Funktionszeiger werden beispielsweise benötigt, um dem Betriebssystem mitzuteilen, welche Funktionen des Anwenderprogramms aufzurufen sind, wenn bestimmte Ereignisse eintreten. So wird beispielsweise in jedem ordentlichen UNIX-Programm eine Signalbehandlung durchgeführt. Dabei meldet das Anwenderprogramm dem Betriebssystem die Funktion, die es aufrufen soll, wenn das Programm terminiert wird. In dieser Funktion kann die Anwendung noch schnell ihre Daten sichern, bevor es dem Betriebssystem gehorcht und sich beendet.

Syntax

Um über einen Funktionszeiger eine Funktion aufrufen zu können, muss die genaue Schnittstelle der Funktion angegeben sein, die auch Rückgabetyp und Parameter beinhaltet. Ein solcher Zeiger folgt dem Syntaxgraph aus Abbildung (graffuncptr).

An dieser Stelle steht im Buch die Abbildung "Syntaxgraph für Funktionszeiger" (graffuncptr)

Kein Prototyp

Wichtig ist die Klammer um den Zeigernamen und den Stern. Dadurch wird verhindert, dass die Parameterklammer vom Compiler bevorzugt wird. Dann würde die Anweisung als Prototyp einer Funktion fehlinterpretiert werden.

Beispiel

Um einen Zeiger auf die Funktion zum Einfügen einer ganzen Zahl in einen Baum zu definieren, orientieren Sie sich am besten an dem Prototyp der Funktion.

tBaum * Einfuegen(tBaum *Blatt, int Inhalt); // Prototyp

Dann setzen Sie einen Stern vor den Funktionsnamen und schließen um beide eine Klammer. Schließlich müssen Sie noch die Parameternamen entfernen, und schon ist der Zeiger auf die Funktion definiert.

tBaum * (*EinfuegeZeiger)(tBaum *, int); // Funktionszeiger

Der Zeiger kann die Adresse einer Funktion durch direkte Zuweisung des Namens erhalten. Sie können dem Funktionsnamen dabei auch ein Adresszeichen voranstellen. Es schadet nicht und macht für den Leser etwas deutlicher, dass Sie die Adresse der Funktion ansprechen.

EinfuegeZeiger = Einfuegen;   // erste Variante
EinfuegeZeiger = &Einfuegen;  // zweite Variante

Aufruf

Der Aufruf der Funktion über den Zeiger unterscheidet sich nicht vom direkten Aufruf der Funktion.

Anker = EinfuegeZeiger(Anker, 22); // Aufruf über den Zeiger