pointer



  • plokosi schrieb:

    frage:

    wo ist der unterschied?
    int a = &b;
    int
    a = &b;

    gibst da überhaupt einen?`

    Nein, die beiden Varianten sind identisch.

    plokosi schrieb:

    ich sehe hier im code, dass wer
    return *a
    macht.
    wenn ich ein Pointer deklariere..muss ich dann immer ein * machen? auch bei der verwendung? dachte immer es reicht wenn ich es nur bei der decklaration mache

    Eine Pointer-Variable ist letztendlich auch nur eine Integer-Variable, die eine Speicheradresse hält. Wenn du a (also die Speicheradresse) zurückgeben willst, notierst du return a . Wenn du allerdings den Wert zurückgeben willst, auf den a zeigt, dann musst du den Pointer dereferenzieren, und das geht mit dem *-Operator.



  • plokosi schrieb:

    wo ist der unterschied?
    int a = &b;
    int
    a = &b;

    Gibt keinen.

    plokosi schrieb:

    ich sehe hier im code, dass wer
    return *a
    macht.
    wenn ich ein Pointer deklariere..muss ich dann immer ein * machen? auch bei der verwendung? dachte immer es reicht wenn ich es nur bei der decklaration mache

    Hast du überhaupt eine Vorstellung davon was ein Pointer ist? 🙂
    Also: Ein Pointer ist selbst wie eine Variable, die einen Zahlenwert speichert.

    int *p = 0; // p ist jetzt 0
    // äquivalent zu:
    int *p;
    p = 0;
    

    Dem Zeiger an sich kannst du also jeden Wert zuweisen, den du haben möchtest, wie bei einer normalen Variablen. Interessant wird das Sternchen:

    int b = 6;
    int *p = &b; // p hat jetzt den Wert der Adresse von b. Man sagt p zeigt auf b.
    *p = 9; // Hier wird es spannend. Man beachte das Sternchen. Nicht p wird ein neuer Wert zugewiesen, sondern b. 
            // Hier wird also der Wert den p hat als Adresse in den Speicher interpretiert (man sagt p wird dereferenziert) 
            // und an diese Stelle wird die 9 geschrieben.
    

  • Mod

    cooky451 schrieb:

    Also: Ein Pointer ist selbst wie eine Variable, die einen Zahlenwert speichert.

    int *p = 0; // p ist jetzt 0
    // äquivalent zu:
    int *p;
    p = 0;
    

    Dem Zeiger an sich kannst du also jeden Wert zuweisen, den du haben möchtest, wie bei einer normalen Variablen.

    Ähh, nein. Probier mal mit was aus, das nicht 0 ist. Pointer speichern keine Zahlen. Pointer speichern Pointer.



  • SeppJ schrieb:

    Ähh, nein. Probier mal mit was aus, das nicht 0 ist. Pointer speichern keine Zahlen. Pointer speichern Pointer.

    Wenn du einen Wert nicht zuweisen kannst, hast du offensichtlich den falschen Cast benutzt. 😉



  • SeppJ schrieb:

    Ähh, nein. Probier mal mit was aus, das nicht 0 ist. Pointer speichern keine Zahlen. Pointer speichern Pointer.

    Natürlich speichern sie technisch gesehen Zahlen. Das mag vielleicht nicht vom Standard garantiert sein, ist für das Verständnis aber trotzdem wichtig.


  • Mod

    cooky451 schrieb:

    Natürlich speichern sie technisch gesehen Zahlen. Das mag vielleicht nicht vom Standard garantiert sein, ist für das Verständnis aber trotzdem wichtig.

    Dann verstehst du aber falsch oder sehr allgemein. Alles im Computer ist Zahl. Die Zahl die der Pointer repräsentiert ist aber keine Zahl in dem Sinne wie die natürlichen Zahlen. Es ist ein Pointer. Da gelten ganz andere Rechengesetze als für natürliche Zahlen.

    Und es ist auch nicht sinnvoll durch reinterpret_casts einem Pointer einen Zahlenwert zuzuweisen der nicht 0 ist.



  • SeppJ schrieb:

    cooky451 schrieb:

    Natürlich speichern sie technisch gesehen Zahlen. Das mag vielleicht nicht vom Standard garantiert sein, ist für das Verständnis aber trotzdem wichtig.

    Dann verstehst du aber falsch oder sehr allgemein. Alles im Computer ist Zahl. Die Zahl die der Pointer repräsentiert ist aber keine Zahl in dem Sinne wie die natürlichen Zahlen. Es ist ein Pointer. Da gelten ganz andere Rechengesetze als für natürliche Zahlen.

    Hausnummern dividieren macht auch keinen Sinn, trotzdem würdest du sie als Zahlen bezeichnen? Das Einsehen, dass Pointer im Prinzip Hausnummern von Bytes speichern, bzw. einen Index in den Speicher darstellen, hilft dem Verständnis nun mal enorm auf die Sprünge. "Pointer speichern Pointer" mag durchaus korrekter sein, ist aber leider eine Erklärung, die diese komischen Variablen weiterhin als Blackbox erscheinen lässt.



  • SeppJ schrieb:

    Und es ist auch nicht sinnvoll durch reinterpret_casts einem Pointer einen Zahlenwert zuzuweisen der nicht 0 ist.

    In den meisten Fällen nicht, nein. Aber auch hier gibt es Ausnahmen.


  • Mod

    cooky451 schrieb:

    Hausnummern dividieren macht auch keinen Sinn, trotzdem würdest du sie als Zahlen bezeichnen?

    Nein. Das wäre der gleiche Fehlschluss wie von den vielen Leuten, die Postleitzahlen, Telefonnummern oder Kontonummern im Computer als arithmetischen Zahlen speichern wollen oder Geld als Fließkommazahl. Äußere Ähnlichkeit der Darstellung impliziert nicht ähnliches Verhalten.

    Das Einsehen, dass Pointer im Prinzip Hausnummern von Bytes speichern, bzw. einen Index in den Speicher darstellen, hilft dem Verständnis nun mal enorm auf die Sprünge.

    Eben. Pointer sind wie Hausnummern. Das ist eine gute Metapher 👍 . Zahl ist keine gute.


  • Mod

    SeppJ schrieb:

    Eben. Pointer sind wie Hausnummern. Das ist eine gute Metapher 👍 . Zahl ist keine gute.

    Hm. Zahlen sind das schon. Vergleiche Ordinal- und Kardinalzahlen.


Anmelden zum Antworten