12.4 Zeiger, die auf andere Zeiger verweisen 

Zeiger können letztendlich auch auf andere Zeiger verweisen:
int *ptr1; int *ptr2; ptr1 = ptr2;
In diesem Fall zeigen beide Zeiger auf dieselbe Adresse. Dies ist ein wenig verwirrend. Daher folgt ein kleines Beispiel dazu:
/* ptr8.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int wert=10; int *ptr1; int *ptr2; ptr1 = &wert; ptr2 = ptr1; printf("ptr1 verweist auf %p\n", ptr1); printf("Wert in %p ist %d\n\n", ptr1, *ptr1); printf("ptr2 verweist auf %p\n", ptr2); printf("Wert in %p ist %d\n\n", ptr2, *ptr2); printf("Adresse von ptr1 : %p\n", &ptr1); printf("Adresse von ptr2 : %p\n", &ptr2); printf("Adresse von wert : %p\n\n", &wert); printf("ptr1 [%p] -> [%p] = [%d]\n", &ptr1, ptr1, *ptr1); printf("ptr2 [%p] -> [%p] = [%d]\n", &ptr2, ptr2, *ptr2); return EXIT_SUCCESS; }
Bei diesem Programm verweisen beide Zeiger auf denselben Wert (genauer gesagt auf dieselbe Adresse), nämlich auf die Adresse der Variablen wert. Mit ptr2 = ptr1 bekommt ptr2 dieselbe Adresse zugewiesen, auf die schon ptr1 zeigt. Auffällig ist hierbei auch, dass kein Adressoperator verwendet wird. Dieser wird nicht benötigt, da der Wert eines Zeigers schon eine Adresse ist und ein Zeiger auch einen Wert als Adresse erwartet.
Würde jetzt
*ptr1 = 11;
im Programm eingefügt, würde der Wert der Variablen wert auf 11 geändert, und somit wäre die Ausgabe des Programms immer 11. Falls Sie
wert = 20;
schreiben, werden auch die beiden Zeiger (mit Verwendung des Dereferenzierungsoperators) 20 ausgeben, da die Zeiger ja weiterhin auf die Speicheradresse der Variablen wert zeigen.
Abbildung 12.10 Ein Zeiger bekommt die Adresse eines anderen Zeigers.
12.4.1 Subtraktion zweier Zeiger 

In der Standard-Headerdatei <stddef.h> befindet sich ein primitiver Datentyp ptrdiff_t, der meist mit int deklariert ist. Dieser wird verwendet, um das Ergebnis aus der Subtraktion zweier Zeiger zurückzugeben. Diese Subtraktion wird verwendet, um zu berechnen, wie weit zwei Zeiger zum Beispiel in einem Vektorelement voneinander entfernt sind. Näheres über den Zusammenhang von Arrays bzw. Strings und Zeigern können Sie in Abschnitt 12.7 lesen. Hier sehen Sie ein einfaches Listing:
/* ptr9.c */ #include <stdio.h> #include <stddef.h> /* für ptrdiff_t */ #include <stdlib.h> int main(void) { char *ptr1, *ptr2; ptrdiff_t diff; /* Primitiver Datentyp */ char string[] = { "Hallo Welt\n" }; /* ptr2 auf Anfangsadresse von string */ ptr2 = string; /* ptr1 6 Bytes weiter von der Adresse ptr2 platzieren */ ptr1 = ptr2 + 6; /* Wie weit liegen beide Zeiger voneinander entfernt? */ diff = ptr1-ptr2; // Nach dem neuen C99-Standard können Sie die formatierte // Ausgabe auch mit dem Argumenttyp-Modifikator t für // ptrdiff_t verwenden, also %td anstatt %d. printf("Differenz der beiden Zeiger : %d Bytes\n",diff); printf("%s",ptr1); /* Welt */ printf("%s",ptr2); /* Hallo Welt */ return EXIT_SUCCESS; }
Mit der Zeile
ptr1 = ptr2 + 6;
lassen Sie den Zeiger ptr1 auf die Adresse string[6] zeigen. ptr2 zeigt hingegen weiterhin auf die Anfangsadresse des Strings (string[0]). Die Differenz dieser beiden Zeiger beträgt 6 Bytes, da diese so weit voneinander entfernt sind.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.