Pointer Verständnisfrage



  • Hallo,

    ich versuche gerade Pointer zu verstehen und hätte dazu noch eine Frage:

    Ich habe ein paar Zeilen zum testen geschrieben und verstehe in erster Linie nicht ganz, warum in der 14 Zeile nicht die Zahl 3 raus kommt. In Zeile 8 zähle ich ja den Wert von i um eins hoch. Des weiteren habe ich in Zeile 8 noch einen Kommentar geschriebne, dessen "Lösung" mich interessieren würde.

    int i= 2;
    int* h = &i;
    
    cout << i << endl;	// 2
    cout << h << endl;	// Adresse von i = 2
    cout << *h << endl;	// Inhalt von i durch den Pointer h auf i
    
    i = *h++;			// Hätte ich hier einfach *h++; schreiben können (also ohne i = )
    					// um den gleichen Effekt zu erhalten? Eine Änderung der variable i würde
    					// ich ja nur erhalten, wenn ich ++i nutzen würde?!
    
    cout << i << endl;	// 2
    cout << h << endl;	// Pointer auf die Adrese von i++
    cout << *h << endl; // Hier kommt -858983460 raus...? Warum nicht 3 :) ?
    

    Gruß



  • Hi,
    einfache Regel: Trenne immer Inkrement/Dekrement und * , dann passiert dir so etwas nicht. Das Problem hierbei ist, dass ++ stärker bindet. Es wird also erst h++ und dann *h gemacht. Darum kommt da -858983460 heruas, weil der Zeiger nun auf Müll zeigt. Machst du es richtig, kommt dennoch 2 heraus. Du hast den Unterschied zwischen Pre- Postfix nicht verstanden. Prefix liefert den alten Wert zurück, Postfix den neuen.

    http://en.cppreference.com/w/cpp/language/operator_precedence



  • *h++ ist identisch mit *(h++)

    Du erhähst also erst den Zeiger und dereferenzierst dann eine Speicherstelle die dir nicht gehört.



  • out schrieb:

    Machst du es richtig, kommt dennoch 2 heraus. Du hast den Unterschied zwischen Pre- Postfix nicht verstanden. Prefix liefert den alten Wert zurück, Postfix den neuen.

    Murks geschrieben, Sorry. Muss genauer hinschauen. Du hast hier 2 Seiteneffekte ohne sequence point dazwischen. Das darfst du nicht machen, das ist gefährlich, da unklar ist, wann Seiteneffekte eintreten. Hier kann 2 oder 3 das Ergebnis sein.



  • out schrieb:

    out schrieb:

    Machst du es richtig, kommt dennoch 2 heraus. Du hast den Unterschied zwischen Pre- Postfix nicht verstanden. Prefix liefert den alten Wert zurück, Postfix den neuen.

    Murks geschrieben, Sorry. Muss genauer hinschauen. Du hast hier 2 Seiteneffekte ohne sequence point dazwischen. Das darfst du nicht machen, das ist gefährlich, da unklar ist, wann Seiteneffekte eintreten. Hier kann 2 oder 3 das Ergebnis sein.

    Wenn du es in eine Zeile schreibst. Darum wieder die Regel: Nicht in eine Zeile schreiben 🤡

    😃 Ich hoffe du Blickst noch durch was ich nun gechrieben hab.


  • Mod

    out schrieb:

    out schrieb:

    Machst du es richtig, kommt dennoch 2 heraus. Du hast den Unterschied zwischen Pre- Postfix nicht verstanden. Prefix liefert den alten Wert zurück, Postfix den neuen.

    Murks geschrieben, Sorry. Muss genauer hinschauen. Du hast hier 2 Seiteneffekte ohne sequence point dazwischen. Das darfst du nicht machen, das ist gefährlich, da unklar ist, wann Seiteneffekte eintreten. Hier kann 2 oder 3 das Ergebnis sein.

    ? Das einzig Undefinierte ist hier die letzte Zeile, da sich an der Adresse, auf die h zeigt, kein initialisiertes int-Objekt befindet. Es kann also alles Mögliche ausgegeben werden.



  • camper schrieb:

    out schrieb:

    out schrieb:

    Machst du es richtig, kommt dennoch 2 heraus. Du hast den Unterschied zwischen Pre- Postfix nicht verstanden. Prefix liefert den alten Wert zurück, Postfix den neuen.

    Murks geschrieben, Sorry. Muss genauer hinschauen. Du hast hier 2 Seiteneffekte ohne sequence point dazwischen. Das darfst du nicht machen, das ist gefährlich, da unklar ist, wann Seiteneffekte eintreten. Hier kann 2 oder 3 das Ergebnis sein.

    ? Das einzig Undefinierte ist hier die letzte Zeile, da sich an der Adresse, auf die h zeigt, kein initialisiertes int-Objekt befindet. Es kann also alles Mögliche ausgegeben werden.

    Ja, ne so hab ich das nicht gemeint. Ich dachte, er schaut sich den Link an, und macht dann i = (*h)++, worauf sich meine Aussage bezieht.

    (Etwas bedüdelt grad)



  • qweasdyxc schrieb:

    *h++ ist identisch mit *(h++)

    Du erhähst also erst den Zeiger und dereferenzierst dann eine Speicherstelle die dir nicht gehört.

    Quatsch.
    Zusammengegoogeltes Halbwissen.
    Du bringst Vorrangregel und Auswertungsreihenfolge durcheinander.
    Postfix hat den höheren Rang, der Wert eines Postfix(Sub)-Ausdruckes ist aber der Ausgangswert, also h und nicht (h+1).
    Und der Wert des Gesamtausdruckes ergibt sich somit als *h.


Anmelden zum Antworten