AdressvonZeiern und Adress von Speicher auf dem Heap



  • Also ich versteh das doch schon richtig jetzt, wenn ich habe: int *p=new int[10];
    dann wird mir hier" cout << p << endl; "die Adress von p[0] ausgedruckt, stimmt doch oder?
    wenn ich dann mach"p++; cout << p << endl;"dann wird mir jetzt die Adress von p[1] ausgedruckt?
    Und wenn ich mach:"cout << &p << endl"dann wird mir doch die Adress vom Zeiger p der auf das erste Element gerichtet ist ausgegeben. Bin nämlich grad bisschen verwirrt. Ich seh zuviele Zeiger um mich 🙂
    Dankeschön schon mal im Voraus.



  • Ja, das stimmt so.
    Ein Zeiger ist ja auch eine "Variable", und muss auch irgendwo zuhause sein -- also hat er auch eine Adresse. Also kann es z.B. auch Zeiger auf Zeiger geben.

    Die Standard Streams schreiben wenn du einen Zeiger reinsteckst nicht das auf was er Zeigt raus, sondern den "Wert des Zeigers", also die Adresse von dem auf was er zeigt wenn man so will.

    Da "&p" nun einen Zeiger auf einen Zeiger macht (int**), und du diesen "Zeiger auf p" in den Stream reinsteckst, wird logischerweise die Adresse von p selbst angezeigt, da "&p" ja auf p zeigt. Sozusagen.



  • Jetzt nur mal n primitives Beispiel:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int *a=new int[5];
        a[0]=22;
        a[1]=24;
        a[2]=35;
        a[3]=46;
        a[4]=57;
        int **b=&a;
        cout << *b[0] << endl;  // Ausgabe: 22 RICHTIG!
        cout << *b[1] << endl;  // Ausgabe: 2293696 FALSCH! Warum?
        return 0;
    }
    

    Warum geht das nicht? (also warum kommt da die falsche Ausgabe?)
    Dankeschön schon mal im Voraus.



  • Weil hier [] vor * gewertet wird. Schreib ( *b )[ 1 ] dann gehts, oder **b+1 oder 1[ *b ]. 😉



  • Das hängt am Operator-Vorrang - [] hat höhere Proirität als *, deshalb ist *b[1]= *(b[1]). b[1] ist schon außerhalb des von dir kontrollierten Speichers* und deshalb macht es wenig Sinn, daüber zu sprechen, wohin es zeigt.

    * Mit der Index-Schreibweise gehst du davon aus, daß b auf ein Array von int* zeigt - b[0] ist das erste Element dieses Arrays, b[1] das zweite, also mit etwas Glück ist das b (je nach Speicher-Layout).


Anmelden zum Antworten