Forum: Compiler & IDEs Wieso Zeiger Variable wenn auch int i = &var;


von Kraus (Gast)


Lesenswert?

Wieso brauche ich eigentlich eigene zeigervariablen wenn ich die Adresse 
auch in einer normalen Variablen speichern kann und ausgaben kann?
Somit würde sich der Aufruf von Unterprogrammen genauso gut verbessern 
lassen?

von Peter II (Gast)


Lesenswert?

Kraus schrieb:
> Wieso brauche ich eigentlich eigene zeigervariablen wenn ich die Adresse
> auch in einer normalen Variablen speichern kann und ausgaben kann?

weil bei 64bit ein zeiger nicht mehr in ein int passt.

von NurEinGast (Gast)


Lesenswert?

Weil Du mit dem Zeiger noch was machen willst.

Ein Zeiger "zeigt" auf irgendeine Speicherstelle, mit der Du später 
irgendwas machen willst (schreiben/lesen) .

int i = &var;

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 ?

von Kraus (Gast)


Lesenswert?

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 ?

Stimmt auch wieder, danke!

von Fabian O. (xfr)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Wozu überhaupt Datentypen?
Im Computer ist schliesslich alles nur eine Zahl!

Ob das jetzt Befehle, Zeichen, Integer, Floating-Point Werte oder auch 
irgendwie gespeicherte Adressen sind - letzten Endes sind alles nur 
Bytes mit Binärmustern von 00000000 bis 11111111


Hmmm ......

Könnte es eventuell sein, dass man sich mit der Einführung von 
spezifischen Datentypen einen gewissen Abstraktionslevel schafft, der es 
dem Compiler ermöglicht zumindest rudimentäre Prüfungen durchzuführen, 
damit ich nicht wie wild Äpfel mit Birnen verrechne?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.