Zeiger, Adressen und Lietrale
-
Hi,
ich betrachte folgenden Code:
int* pI; int k = 1234; pI = &k;
Soweit verstehe ich alles. Ich habe zwei Variablen, eine ist vom Typ int mit Bezeichner "k" und dieser Variablen kann ich einen Wert zuweisen.
Weiterhin habe ich eine Variable pI vom Typ Zeiger auf ein Int. Dieser Variable kann ich Adressen zuweisen.
Jede Variable befindet sich an einer Adresse. Also auch Literale.
Somit funktioniert auch das:pI = (int*) 12;
oder sowas:
DoSomething( (void*) 4 ); ... void DoSomething( void* param) { int x = (int) param; //Hier sollte x == 4 sein! }
aber ich kann auch das machen:
pI = (int*) k;
oder
int *pI = (int *)0x00323c68;
Ok. Literale befinden sich auch an Adressen aber ein cast auf (int
ist doch nicht das gleiche wie der Adress-Operator? Verstehe ich nicht.
Gruß
-
FrankTheFox schrieb:
Jede Variable befindet sich an einer Adresse. Also auch Literale.
Das ist falsch. Nur Stringliterale sind eigene Objekte, d.h. sie belegen Speicher und besitzen eine Adresse. (außer Bit-Felder und register Speicherklasse).
FrankTheFox schrieb:
Literale befinden sich auch an Adressen
Falsch s.o.
FrankTheFox schrieb:
aber ein cast auf (int
ist doch nicht das gleiche wie der Adress-Operator? Verstehe ich nicht.
Ein Cast ist keine Adresse, wer behauptet das?
Ein Cast ist eine explizite Typumwandlung und bei (int*) wird der Integerwert direkt (bei Literalen) oder indirekt (bei int-Variablen) vom Compiler als Adresse interpretiert, ein typisierter Zeiger damit initialisiert um anschließend bei der Dereferenzierung des Zeigers genau sizeof(int) Bytes (aligned) zu lesen bzw. zu schreiben.
-
Hi,
ok. Bislang hatte ich ja auch gedacht Zeiger kapiert zu haben. Jo String-Literale besitzen eine Adresse andere nicht. Gut.
Also meine Fragen sind am ebem diesem Codefragment entbrannt:
DoSomething( (void*) 4 ); ... void DoSomething( void* param) { int x = (int) param; //Hier sollte x == 4 sein! }
Wenn also hier das Literal 4 oder wie hier
pI = (int*) 12;
das Literal 12 keine Adressen besitzen, dann wird also das Literal 4 als Adresse interpretiert genauso wie die 12. und nur durch
(int) param;
mache aus der Adresse 4 die Integerzahl 4.
Gruß