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=14

    Man 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!


Log in to reply