C - Anfängerprobleme bei Zeigern
-
Hallo,
ich fange gerade an, C zu lernen (zwecks Uniklausur) und bin auf diese Aufgabe der Altklausur gestoßen:Welche Ausgabe erzeugt folgendes Programm?
int a=5, b, *z1, *z2; z2 = &a; a = a**z2; z1 = z2; b = a+2; z2 = &b; a = (*z2)++; printf("%d\n%d\n%d\n%d\n", a, b, *z1, *z2);
Das Problem ist, dass ich keine Ahnung habe, was in der 3. und in der 7. Zeile passiert.
Vor allem weiß ich gar nicht, was ** bedeuten soll, denn im ganzen Skript finde ich nur einzelne Sternchen und wie ich danach bei Google suchen soll, weiß ich gerade auch nicht so wirklich.
Es wäre nett, wenn mir jemand erst kurz erklären könnte, was diese 2 Sternchen bedeuten und was der Unterschied zu einem ist und dann vielleicht noch, was die beiden von mir genannten Zeilen bewirken.Laut Musterlösung soll da übrigens das hier rauskommen, falls das jemand kontrollieren möchte:
27
28
27
28
-
Ich schreib's mal etwas anders hin:
a = a * (*z2);
Nun klar?
Bei Zeile 7 ist mir nicht klar, was du da dran nicht verstehst. z2 wird dereferenziert und das was da steht wird erhöht und der Wert der da vorher stand wird a zugewiesen.
-
Oh Gott, jetzt komme ich mir ziemlich blöd vor.
Ich dachte, das wäre irgendein Konstrukt, das ich nicht kenne.Ja, ich habe gerade die Dereferezierung nochmal nachgelesen und irgendwie vergessen, dass *z2 nicht die Adresse, sondern der Wert ist.
Dann ist mir das jetzt klar. Vielen Dank für die schnelle Antwort.
-
Diese zwei Sternchen sind genau das - zwei hintereinander stehende Sternchen (also kein geheimnisvoller neuer C-Operator). In diesem Fall ist das erste Sternchen für die Multiplikation zweier Zahlen und das zweite der Dereferenzierungsoperator für Zeiger.
(PS: Und in Zeile 7 hast du eine Dereferenzierung und einen Post-Inkrement - letzterer erhöht die Variable, auf die er angesetzt wurde (*z2, also b) und liefert ihren alten Wert als Rückgabe (dieser Wert wird dann an a zugewiesen))
-
Ja, ich denke, das ist mir nun klar.
Ich war in Zeile 7 nur verwirrt, da ich dachte, mit *z2 würde man auf die Adresse zugreifen, was nach der Musterlösung natürlich überhaupt keinen Sinn gemacht hätte.Nochmals danke.
-
Oh schöne Übung finde ich, da ich auch grad versuche Zeiger zu verstehen.
Ich denke ich verstehe fast alles von der Aufgabe, nur wieso ist z1 auch 27?
z1 zeigt doch auf z2 und der Wert hinter z2 wird doch Zeile 7 um eins erhöht?
-
pointer_lernender schrieb:
... z1 zeigt doch auf z2 ...
Durch
z1 = z2;
zeigt z1 auf die selbe Stelle wie z2 (zu diesem Zeitpunkt).
Danach wird z2 durchz2 = &b;
aber auf eine andere Stelle "verbogen".
-
Ah vielen Dank. Demnach zeigt z1 gar nicht auf z2, sondern auf die gleiche Adresse wie z2.
-
pointer_lernender schrieb:
Demnach zeigt z1 gar nicht auf z2, sondern auf die gleiche Adresse wie z2.
Genau.
z1 und z2 haben dann den gleichen Wert. Und das will man mit
z1 = z2;
ja auch erreichen.Zeiger sind auch nur Variablen. Die speichern halt keine
int
oderfloat
sondern Adressen.