|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
Auch für Funktionen können Zeiger auf Funktionen definiert werden. Und über diese Zeiger können die Funktionen auch wieder aufgerufen werden. Da hier genau auf die Auswertungsreihenfolge der Operatoren geachtet werden muß, ist den Funktionspointern ein eigenes kleines Kapitel gewidmet. Wir erinnern uns an die Zeiger:
int *a;
a ist ein Zeiger auf ein int.
int * d(void);
Da die Klammern eine höhere Priorität haben, ist dies eine Funktion d mit dem Returnwert int *. Damit wir einen Funktionspointer haben, muß also der * an den Namen der Funktion "gebunden" werden. Also müssen wir klammern.
int (*d)(void);
Dies ist jetzt ein Zeiger d vom Typ Funktion ohne Parameter mit einem Returnwert int. Wenn wir den Zeiger verwenden wollen, muß er wieder dereferenziert werden. Da auch hier der * eine geringere Priorität als die Klammern für den Parameter haben, muß die Dereferenzierung geklammert werden.
Die Adresse einer Funktion bekommt man analog der Adresse von Feldern einfach durch den Namen ohne Klammern.
#include <stdio.h> int a(int x,int y) { return x+y; } int main(void) { int (*p)(int,int); p = a; printf("Summe = %d\n",(*p)(3,4)); return 0; }
Funktionspointer lassen sich immer dann verwenden, wenn ein Algorithmus unabhängig von einem konkreten Datentyp formuliert werden soll. Z.B. muß ein Sortieralgorithmus die Daten vergleichen, er benötigt also eine Vergleichsfunktion. Ein Beispiel gehört zur ANSI Lib. Wer einmal in die Datei stdlib.h nachschaut, findet dort:
void qsort( void *base, size_t nmemb, size_t size, int (*compar)() );
Oder ein Zeichenprogramm verwaltet grafische Objekte und zu jedem Objekt gehört eine passende Zeichenfunktion, die das Objekt malen kann. Wenn als Zeiger auf die eigentlichen Objektdaten ein typloser Zeiger benutzt wird, muß die Verwaltung keine Kenntnisse der Objekte haben. Wir nähern uns damit schon den Möglichkeiten der objektorientierten Programmierung, wenn wir unterschiedliche Daten mit der gleichen Schnittstelle behandeln können.
English version not yet available. |