Jede Variable hat ihre eigene Speicheradresse bei der ein Wert abgelegt ist. In dieser Übung werden Pointervariable eingeführt: ein Variablentyp, der Adressen statt Werte speichert.
Es wird gezeigt, wie Pointervariable zur Speicherung von Adressen von Variablen eingesetzt werden und wie man den an einer bestimmten Adresse abgespeicherten Wert findet.
Ein Testprogramm
In diesem Programm werden zwei Variable, varA und varB vom Typ int deklariert und es wird gezeigt, wie mit Hilfe von addr der bei varA abgespeicherte Wert und seine Adresse ausgelesen werden können.
In einem zweiten Schritt wird dann die Adresse von varB der Variablen addr zugewiesen und der Wert, der in varB abgespeichert ist und seine Adresse ausgelesen.
Aufgaben |
|
Das Programm Pointer und Variable.c
Wir arbeitet das Programm?
Zeilen 3 – 5
Es werden zwei Variablen, varA und varB vom Typ int, deklariert und initialisiert. Ihnen werden die Werte 100 und 200 zugewiesen. Die Variable addr speichert Adressen. Das Sternchen (*) links neben dem Bezeichner addr ist für den C Compiler der Hinweis Adressen von Variablen vom Typ int zu speichern. Wir bezeichnen solche Sternchen-Variablen als Pointer.
int *addr;
Nach dieser Deklaration können der Variablen addr Adressen von Variablen zugewiesen werden. Dazu muss der Variablen der Operator & vorangestellt werden.
Zeile 9
Weist der Variablen addr die Adresse von varA zu.
addr = &varA;
Zeile 10
Gibt im Terminalfenster die Adresse der Variablen varA aus.
print("addr = &varA;\n\n");
Zeile 11
Durch den vorangestellten Operator & wird die Adresse der Variablen varA ausgegeben.
Zeile 12
Gibt den Speicherinhalt von varA im Terminal aus.
Zeile 13
Gibt den Speicherinhalt von addr aus.
Zeile 14
Gibt den Speicherinhalt an der Adresse, die in *adress gespeichert ist, aus.
Die Betrachtungen für die restlichen Zeilen des Programms laufen ähnlich.
Ein * Operator, der unmittelbar links vor einer Variablen steht, macht diese zu einer Pointervariablen, die Adressen speichert, keine Werte.
Ist in addr die Adresse von varA gespeichert, dann liefert *addr den Wert, der in der Variablen varA gespeichert ist.
Ohne den * Operator gibt eine Pointervariable wie addr nur die zuletzt gespeicherte Adresse aus.
Pointervariable lassen sich auch in Arrays verwenden. Sei arrayVar der Name eines Arrays vom Typ int. Die Adresse jedes einzelnen Elementes kann nach addr kopiert werden.
Wenn addr die Adresse von arrayVar[0] enthält, wird durch Addition von 1 der Pointer auf die Adresse von arrayVar[1] zeigen, obwohl die Adresse 4 Byte entfernt liegt. Mit anderen Worten, addr = addr + 1 oder addr++ addiert automatisch 4 zur Variablen addr und lässt sie auf das nachfolgende Feldelement zeigen.
Bei einem Char-Feld sind die einzelnen Arrayelemente nur 1 Byte voneinander entfernt. Und auch hier funktioniert die automatische Anpassung.