NurEinGast schrieb:
> Wenn Du nun in Deiner Variable i die Addresse von "var" stehen hättest,
> wie würdest Du dann auf den Inhalt der Variabel "var" zugreiben ?
Das würde prinzipiell schon gehen:
1 | int var = 42;
|
2 | int i = &var;
|
3 | int x = *((int*) i);
|
4 | printf("%i", x);
|
Allerdings warnt der Compiler davor zu Recht. Denn wenn man einen Zeiger
in eine int-Variable speichert (vorausgesetzt, er passt überhaupt rein),
geht für den Compiler die Information verloren, auf was für einen
Datentyp der Zeiger zeigt. Also ob es ein int*, char*, oder vielleicht
mein_struct_t* ist.
Bevor man den Wert in i dereferenziert, muss man ihn deshalb erst wieder
in einen Zeiger mit dem richtigen Typ umwandeln. Sonst weiß der Compiler
nicht, wie viele Bytes er von der Adresse lesen/schreiben soll. Bei
einem char* wär es nur ein Byte, bei einem int dagegen zwei oder vier
Bytes.
Wenn man dabei einen Fehler macht und den Integer in den falschen
Zeiger-Typ umwandelt, kann alles mögliche passieren. Wenn man einen
Zeiger speichert, nimmt man deshalb gleich eine Zeigervariable. Erstens
ist dann sicher, dass da auch ein Zeiger reinpasst und zweitens weiß der
Compiler dann automatisch, wie er ihn richtig dereferenziert.
Mal ganz abgesehen davon, dass es auch für den Benutzer einer Funktion
wesentlich klarer ist, wie er sie zu benutzen hat, wenn sie einen Zeiger
eines bestimmten Typs erwartet:
1 | puts(char* string, int len)
|
Hier ist klar: Die Funktion will einen Zeiger auf ein char.
1 | puts(int string, int len);
|
Hier käme kein Mensch drauf, dass string eigentlich ein char-Pointer
sein soll ...
Der entstehende Maschinencode wäre letztlich der gleiche (wie gesagt,
sofern die int-Variable groß genug für einen Zeiger ist). Warum sollte
man also solche Umwege gehen? Außer Verwirrung und Fehlerquellen bringt
das nichts.