Zeiger auf Zeiger - Ausgabe - warum?
-
Moin!
Ich habe folgendes Verständnisproblem.Soweit ich das unten stehende Programm verstehe lege ich mit
int***stack1ein 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***stack1ein 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