![]() Vorherige Seite |
![]() Eine Ebene hoch |
![]() Nächste Seite |
---|
Wie fast alles in C können auch Zeiger ineinander verschachtelt werden. Ein einfacher Zeiger zeigt auf Datentypen wie int oder float. Es ist nun möglich einen Zeiger zu definieren, der wieder auf einen Zeiger zeigt. In der folgenden Tabelle ist das dargestellt.
Adresse | Datum | Datentyp | Inhalt | Beispiel |
---|---|---|---|---|
... | ||||
01C0 7D04 01C0 7D05 01C0 7D06 01C0 7D07 |
80 1D 2C 04 | int | Zahl 70.000.000 | int n=70.000.000; |
... | ||||
01C4 E358 01C4 E359 01C4 E35A 01C4 E35B |
04 7D C0 01 | Zeiger auf int |
Adresse 01C0 7D04 | int *pn=&n; |
... | ||||
01C5 3460 01C5 3461 01C5 3462 01C5 3463 |
58 E3 C4 01 | Zeiger auf Zeiger auf int |
Adresse 01C4 E358 | int **ppn=&pn; |
... |
In der Tabelle ist die Variable n vom Typ int und wird mit dem Wert 70.000.000 initialisiert. Die Variable pn ist ein Zeiger auf die Variable n und zeigt auf die Adresse 01C0 7D04. Schließlich ist die Variable ppn ein Zeiger auf den Zeiger pn. ppn ist ein Zeiger auf einen Zeiger, der seinerseits auf den Datentyp int zeigt. Der Zeiger ppn wird mit int **ppn initialisiert.
Um auf den Zahlenwert zuzugreifen, muss der Sternoperator doppelt angewendet werden. Beispiel:
printf("Zahl: %d\n", **ppn);
Wo können Zeiger auf Zeiger sinnvoll verwendet werden? Als Beispiel sollen zwei Dateien mit einer Funktion geöffnet werden. Die Funktion soll die Datei öffnen und eventuelle Fehler abfangen. Der Aufruf erfolgt mit:
if(OpenFile(argv[1], "rt", &inp)) return -1);
Bei einem Fehler soll die Funktion einen Wert ungleich null zurückgeben, so dass das Programm ggf. abgebrochen werden kann. Damit der Zeiger inp innerhalb der Funktion manipuliert werden kann, muss ein Zeiger auf diese Variable übergeben werden. (Zum Thema Parameterübergabe siehe Abschnitt 4.1.2). Die Implementierung könnte folgendermaßen erfolgen:
int OpenFile(char FileName[], char Mode[], FILE **file) { *file = fopen(FileName, Mode); if(*file==NULL) { printf("Fehler beim �ffnen der Datei '%s'!\n", FileName); return -1; } return 0; }
In der Funktion ist file ein Zeiger auf einen Zeiger, der auf den Datentyp FILE zeigt. Man spricht von Zeiger auf Zeiger auf FILE.