Warum Speicherplatz für Zeiger?



  • Hey,
    ich hätte da mal eine Frage.

    Erstmal Code:
    [cpp]
    struct Peter
    {
    int loewenzarren;
    }:

    //...

    int main(void)
    {
    Peter *lustig;
    lustig = new Peter;
    lustig->loewenzarren = 12;
    }[cpp]

    Sehe ich das richtig, dass man den Speicherplatz für den Zeiger reservieren muss, weil die Adresse nicht genug Speicherplatz zur Verfügung hat?

    Hellraiser



  • Nein, Du musst Speicher reservieren, weil ein Zeiger auf Peter kein Peter ist.
    Sinnbildlich:
    Wenn Du mit dem Finger auf Peter zeigst, ist Dein Finger dann Peter?



  • Hallo,
    ich verstehe das nicht, entschuldigung.



  • Hallo.
    ich schon, kein problem.

    Wo liegt dein Problem?
    der new-Operator liefert einen Zeiger (also die Adresse) auf den reservierten Speicherplatz zurück, und der Speicherplatz wird hier nun einmal für lustig reserviert.


  • Administrator

    Hellraiser schrieb:

    Hallo,
    ich verstehe das nicht, entschuldigung.

    Ein Zeiger ist nur eine Adresse an einen Speicherort. Meistens auf einem 32 Bit System 4 Bytes und auf einem 64 Bit System 8 Bytes. Ein Zeiger ist also eine Zahl, welche auf ein Byte im Hauptspeicher zeigt.

    Der Zeiger hat somit nichts mit dem eigentlichen Objekt zu tun. Der Zeiger sagt nur aus, dass beim entsprechendem Byte, auf welches er zeigt, ein entsprechendes Objekt ist.
    Man muss allerdings zuerst dieses Objekt an der entsprechenden Stelle anlegen und übergibt dann die Adresse dem Zeiger. Über den Zeiger kann man dann auf das Objekt an der Stelle, auf welche der Zeiger zeigt, zugreifen.

    Verständlicher? 🙂

    Grüssli



  • Ein zeiger ist auch nur eine Variable. Und so eine Variable, die einfach nur eine Zahl speichert.

    int i; // Variable die eine Zahl speichert.
    int *m;  // Variable die eine Zahl speichert
    
    i = 1000; // in der Variable steht der Wert 1000
    m = 1000; // in der Variable steht der Wert 1000
    

    Jetzt sollte klar sein, warum ein Zeiger Speicher verbraucht.

    Mit dem * -Symbol wird allerdings diese Variable semantisch als Zeiger deklariert! D.h. samantisch steht oben: m hat den Wert 1000, dieser Wert bedeutet aber Speicheradresse 1000. Und an dieser Speicheradresse steht ein int-Wert. Diesen kann ich so manipulieren:

    *m = 5; // jetzt steht an Speicheradr. 1000 eine 5
    


  • Bulli schrieb:

    int *m;
    m = 1000; // in der Variable steht der Wert 1000
    

    Ohne reinterpret_cast funktioniert das nicht. Ein Zeiger muss auch nicht zwingend einen Integerwert repräsentieren, muss aber in einen solchen konvertierbar sein.



  • Meint ihr nicht, der Poster wollte nur ein bisschen "trollen"? Ich fand die Erklärung von Tachyon schon echt gut verständlich! 🙂


Anmelden zum Antworten