PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Einfache Pointer & Array Fragen


Gast
2013-11-20, 00:23:39
int** testArray = new int*[2];
int* int1 = new int(1);
testArray[0] = int1;
testArray[1] = new int(2);

std::cout << **testArray << std::endl; // 1
std::cout << *testArray[0] << std::endl; // 1
std::cout << int1 << std::endl; // pointer auf 1
std::cout << *testArray << std::endl; // pointer auf 1
std::cout << testArray[0] << std::endl; // pointer auf 1
std::cout << &int1 << std::endl; // adresse des pointers auf 1
std::cout << &testArray[0] << std::endl; // weshalb ist dies nicht auch die adresse des pointers auf 1?
std::cout << testArray << std::endl; // weshalb ist dies nicht auch die adresse des pointers auf 1?
std::cout << &testArray << std::endl; // adresse des arrays? weshalb nicht adresse des pointers auf das erste element?
std::cout << &(&testArray) << std::endl; // weshalb funktioniert dies nicht?


Ergebnis:

1
1
00A2B800
00A2B800
00A2B800
0078F7F8
00A298F8
00A298F8
0078F804


Die Fragen stehen eigentlich schon als Kommentar im Code.
1. weshalb liefert '&testArray[0]' und 'testArray' nicht das gleiche Ergebnis wie '&int1'?
2. In meinem Referenzbuch steht, dass '&testArray' die Adresse des Arrays ergibt. Nehm ich zu Kenntnis, aber ich finde es ist unlogisch, da 'testArray' ja eigentlich der Pointer auf das erste Element ist, wenn das Array nicht aus Pointern besteht. Deshalb müsste es für mich die Adresse des ersten Pointers sein.
3. Weshalb funktioniert '&(&testArray)' nicht? Meiner Logik nach müsste es die Adresse des ersten Pointers im Array sein.

Aber es scheint, als sei meine Logik reichlich unlogisch...

Marscel
2013-11-20, 00:48:53
1. weshalb liefert '&testArray[0]' und 'testArray' nicht das gleiche Ergebnis wie '&int1'?


int1 ist ein Zeiger, der im Stack liegt. testArray[0] ist ein Zeiger, den du dorthin in den heap-allokierten Speicher kopiert hast.

2. In meinem Referenzbuch steht, dass '&testArray' die Adresse des Arrays ergibt. Nehm ich zu Kenntnis, aber ich finde es ist unlogisch, da 'testArray' ja eigentlich der Pointer auf das erste Element ist, wenn das Array nicht aus Pointern besteht. Deshalb müsste es für mich die Adresse des ersten Pointers sein.

Nein. Bei dir ist testArray ist ein Zeiger, der ebenfalls auf dem Stack liegt, nahe int1.

3. Weshalb funktioniert '&(&testArray)' nicht? Meiner Logik nach müsste es die Adresse des ersten Pointers im Array sein.

testArray: Adresswert = Zeiger, &testArray: Adresse des Zeigers auf dem (hier) Stack. Mehr gibts nicht zu referenzieren. Fündig wirst du mit &(testArray[0]). Liegt auf dem Heap, siehst du an den Adressen.

Threadstarter
2013-11-21, 22:35:46
Danke, nach fünfmaligem Durchlesen hab ich mir nun doch vorstellen können, was genau am Stack und was am Heap alloziert wird!

Eine kleine Frage hätte ich jedoch noch:


// ein array ist ein pointer auf einen speicherbereich
int test1[2];
int* test2 = test1;

// somit ist auch der pointer auf das array ein pointer auf einen pointer
int** test3 = &test2
// weshalb funktioniert dann aber dies nicht:
int** test3 = &test1; // falsch

"test1" ist zwar ein pointer, aber weshalb ist dann "&test1" nicht ein pointer auf diesen pointer, sonder vom typ "int (*)[2]"?

samm
2013-11-21, 23:02:08
"test1" ist zwar ein pointer, aber weshalb ist dann "&test1" nicht ein pointer auf diesen pointerWeil es die Speicheradresse von test1 ist.
sonder vom typ "int (*)[2]"?Ist es nicht ;)

Threadstarter
2013-11-21, 23:16:49
Ist es nicht ;)

Erleuchte mich!

Gast
2013-11-22, 10:28:51
Vermutlich, weil "int (*)[2]" kein üblicher C++-Datentyp ist, sondern in einer Fehlermeldung durch den Compiler zur Bezeichnung eines dereferenzieren int-Arrays der Länge 2 verwendet wird.

Marscel
2013-11-22, 10:52:43
Überleg dir immer 2 Dinge, abseits irgendwelcher Typkonstrukte, die gerne unvollständig gelehrt werden: a) wo liegt was im Speicher und b) wie sieht es dort aus.

In deinem Fall ist test1 ein Array, dessen Elemente im Stack liegen. test1 ist auch hier eine (rel.) Adresse. Aber: liegt diese Adresse - wie ein Zeiger - irgendwo referenzierbar im Speicher? Nein. Warum auch, der Compiler weiß, wie der Stack aussieht und kann test1 einfach durch die Startadresse des Arrays ersetzen. test1 ist also viel mehr bloß ein Alias für &(test1[0]).