Typeumwandlung von Zeiger?
-
Hallo,
ich bin ein Neuling im Bereich der C-Programmierung und besitze ein Buch: "GoTo - C-Programmierung".Folgendes Szenario:
int *p, a; a = 10;
Nun soll der Speicherbereich, auf den p zeigt den Wert von a annehmen:
p = a;
So funktioniert das nicht.
Eine Möglichkeit von mir war:*p = a;
Nur leider war dies dem Betreuer gar nicht recht...
Ich soll explizit dem Speicherbereich, auf den p zeigt, den Wert von a zuweisen... Er meinte, dies soll per cast funktionieren, nur kann ich damit nix anfangen...Mein Buch meint hierzu folgende 2 Beispiele:
((int)p) = a;
bzw.
((int *)p = a;
In beiden Fällen gibt der Compiler einen error aus:
invalid lvalue in assignment.Wie gestalte ich dies richtig? Ich nutze vim und den gcc, lasse mit -Wall kompilieren, um wirklich alles zu erkennen...
Vielen Dank im vorraus für Eure Hilfen...
-
p=&a;
genügt auch nicht?
-
Was genau will Dein Betreuer?
*p = a;
Dieses Konstrukt weist dem Speicherbereich, auf den p zeigt, explizit den Wert der Variablen a zu. Sprich an der Speicherstelle, auf die p zeigt, steht 0000000A (sofern int 4 Byte hat). Da muss nix gecastet werden.
p = &a;
Dieses Konstrukt weist dem Zeiger p die Speicherstelle zu, an der a ihren Wert speichert. Danach ist *p (Inhalt der Speicherstelle) identisch mit a. Da muss auch nix gecastet werden.
Die Aufgabenstellung ist unklar
-
LordJaxom schrieb:
...an der Speicherstelle, auf die p zeigt, steht 0000000A (sofern int 4 Byte hat).
er meint: 'da steht 10'
-
Er wollte, dass der Speicherbereich, wo p hinzeigt, den Wert von a annimmt.
Ich habe es lösen können, da der Compiler in der Ursprungsversion meint, es fände eine Typumwandlung statt, ohne einen expliziten Cast anzugeben. Ich versuchte, das lvalue zu ändern; die Fehlermeldung lautete aber, dass ein pointer aus einem int erzeugt wird. Es war eine warning, kein error, somit wurde das Programm erzeugt. Dies hatte ich jedoch nicht so richtig beachtet, da ich in der Konsole arbeite.Richtig ist:
p = (void *) a;
Vielen Dank für Eure Hilfen
-
doolittles schrieb:
Er wollte, dass der Speicherbereich, wo p hinzeigt, den Wert von a annimmt.
[...]
Richtig ist:p = (void *) a;
Nein, das ist nicht richtig. Das interpretiert den Wert von a als Adresse und weist diese p zu.
-
Da hat Bashar recht. Für mich klingt das nach einem Kommunikationsproblem zwischen dir und deinem Betreuer.