Verständnis der Funktionsweise von Pointern
-
Hallo liebe Forenmitglieder,
Ich heiße Hans und lerne seit ein paar Wochen C. Zur Hilfe benutze ich das c-how to Tutorial von Elias Fischer.
Ich habe gerade das Kapitel über Zeiger bearbeitet, dazu gibt es am Ende ein kurzes Rechenbeispiel inklusive der Lösungen:int a=2, b=5, *c=&a, *d=&b;
a = *c * *d; // a=10
*d -= 3; // b=2, *d=2
b = a * b; // b=20
c = d; // *c=20
b = 7; // b=7
a = *c + *d; // a=14Man sollte handschriftlich einfach den Wert ausrechnen, der für jede Zeile bzw. für die verschiedenen Variablen und Pointer herauskommt.
Wahrscheinlich ist das total easy, aber ab Zeile 4 (c=d) blick ich nicht durch, was genau da passiert. Nach meinem Verständnis sind Pointer selbst Variablen, die auf die Adresse anderer Variablen oder Pointer zeigen können.
c=d ; an der Stelle wird der Variable c, die bisher nicht initialisiert wurde(glaub ich?) der Wert d zugewiesen. d wurde aber auch nirgends initialisiert, sondern "nur" *d. *d zeigt auf b, und b ist 20, also hat auch *d den Wert 20. Bedeutet das dann, dass automatisch eine Variable d mit Wert 20 erstellt wird?
Wieso kommt dann unten 14 raus? *d ist mir klar, weil b vorher 7 zugewiesen wurde, aber wieso ist dann *c auch 7, und nicht 20?Danke für eure Hilfe! Bitte verzeiht das Niveau der Frage.. ich hoffe ich stehe hier einfach gerade auf dem Schlauch ..
-
c=d ; an der Stelle wird der Variable c, die bisher nicht initialisiert wurde(glaub ich?) der Wert d zugewiesen. d wurde aber auch nirgends initialisiert,
*c=&a, *d=&b;
c zeigt auf die Adresse von a und d auf die Adresse von b
c = d;
c zeigt damit auf dieselbe Adresse auf die d zeigt - also auf b
-
H@ns2014 schrieb:
Nach meinem Verständnis sind Pointer selbst Variablen, die auf die Adresse anderer Variablen oder Pointer zeigen können.
Genau so ist es.
H@ns2014 schrieb:
c=d ; an der Stelle wird der Variable c, die bisher nicht initialisiert wurde
Das ist nicht richtig, denn in deiner ersten Zeile steht *int c=&a
Da wird dem Pointer c die Adresse von der Variablen a zugewiesen.
Beachte aber, dass dies eine Definition mit Initialisierung ist.H@ns2014 schrieb:
.. der Wert d zugewiesen.
Richtig. (Aber was ist in d gespeichert?)
H@ns2014 schrieb:
d wurde aber auch nirgends initialisiert, sondern "nur" *d.
Wieder falsch, da du in der ersten Zeile *int d=&b; hast.
H@ns2014 schrieb:
*d zeigt auf b, und b ist 20, also hat auch *d den Wert 20.
Hier kommst du durcheinander. d (ohne zeigt auf b, *d hat den Wert 20, da b den Wert 20 enthält.
Mit dem Derefernzierungsoperator * greifst du auf den Inhalt an der Adresse zu, auf die der Zeiger verweist.
Ohne dem * hast du die Adresse auf die gezeigt wird.
Durch c = d; zeigt c auf die selbe Stelle wie d.
-
Ah, okay! Jetzt hab ich's kapiert. Vielen Dank! Das ging ja ziemlich schnell mit der Beantwortung .
Danke euch!