14.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 auf dieselbe Adresse), nämlich 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. Schreiben Sie
wert = 20;
werden auch die beiden Zeiger (mit Verwendung des Dereferenzierungsoperators) 20 ausgeben, da die Zeiger ja weiterhin auf die Speicheradresse der Variablen wert zeigen.
Hier klicken, um das Bild zu Vergrößern
Abbildung 14.10
Ein Zeiger bekommt die Adresse eines anderen Zeigers
14.4.1 Subtraktion zweier Zeiger
In der Standard-Headerdatei <stddef.h> befindet sich ein primitiver Datentyp ptrdiff_t, welcher 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 einige Seiten weiter unten lesen.) Hier 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;
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.
|