Zeiger auf Zeiger - Ausgabe - warum?



  • Moin!
    Ich habe folgendes Verständnisproblem.

    Soweit ich das unten stehende Programm verstehe lege ich mit

    int***stack1
    

    ein stack objekt mit 3 aufeinander folgenden heap-objekten.

    quasi so: stack1 ***objekt -> **heap1 -> **heap2 -> heap3

    stack2: stack2* objekt -> heap1

    Durch

    *stack1=&stack2;
    

    zeigt nun das 1. heapObjekt von stack1 auf das stackObjekt stack2.

    Sehe ich das soweit richtig?

    Nun zum eigentlichen "Problem":

    Warum bekomme ich an der von mir mit " // <<<" gekennzeichneten stelle eine 40 ausgegeben?

    void main()
    {
    	int***stack1;
    	int*stack2;
    
    	stack1=new int**;
    	stack2=new int;
    
    	*stack1=&stack2;
    	*stack2=40;
    
    	cout <<  stack1 << endl;
    	cout <<  *stack1 << endl;
    	cout <<  **stack1 << endl;
    	cout <<  ***stack1 << endl; // <<<
    	cout <<  stack2 << endl;
    	cout <<  *stack2 << endl << endl;
    }
    


  • Naja, wenn *stack1 == &stack2 ist, ist **stack1 == stack2 und ***stack1 == *stack2.



  • Danke für deine sehr rasche Antwort (zu solch später Stunde)...
    Doch trotzdem ist es mir nicht so ganz klar.

    wenn *stack1 == &stack2 ist," // klar

    ist **stack1 == stack2 // warum? ich sage doch nur explizit das *stack1 auf stack 2 zeigen soll und nicht dass **stack1 auf stack2 zeigt...

    und ***stack1 == *stack2. // - " -

    Es ist warscheinlich sehr simpel aber irendwie habe ich wohl eine Blockade.



  • und nicht dass **stack1 auf stack2 zeigt...

    **stack1 zeigt ja auch nicht auf stack2, sondern auf die 40.



  • Soweit ich das unten stehende Programm verstehe lege ich mit
    C/C++ Code:

    int***stack1
    

    ein stack objekt mit 3 aufeinander folgenden heap-objekten.

    quasi so: stack1 ***objekt -> **heap1 -> **heap2 -> heap3

    Nein...

    Du legst gar nichts an. Du Deklarierst nur einen Zeiger auf einen Zeiger auf einen Zeiger auf einen int.

    stack1=new int**;
    

    In dieser Zeile legst du einen(!) Zeiger auf dem Heap an.[1]
    Es ist ein Zeiger auf einen Zeiger auf ein int.
    Deine Variable stack1 zeigt nun auf diesen Speicherbereich.

    stack2=new int;
    

    Hier erstellst du ein int [2] auf dem
    stack2 verweist nun auf diesen int.

    *stack1=&stack2;
    

    Hier dereferenzierst du dein stack1 und änderst dadurch den Speicherbereich
    für [1]. Dieser zeigt nun auf die Speicheradresse des Zeigers stack2.
    Das ist eine Stackadresse!!

    *stack2=40;
    

    Hier dereferenzierst du den Zeiger stack2 und veränderst damit den Inhalt
    von [2]

    Am Ende hast du dann sowas:

    stack1(Stack) -> [1](Heap) -> stack2(Stack) -> [2] mit Wert 40(Heap)

    Gruß,
    CSpille



  • Ah!
    Na das macht doch Sinn! Vielen Dank für die ausführliche Erklärung!

    MFG


Anmelden zum Antworten