[Anfänger] Ausgabe dynamischer Speicherobjekte
-
Ich habe folgenden Code:
# include <iostream> using namespace std; int main() { int *dynarray = nullptr; // Zeiger angelegt dynarray = new int[4] {11,22,33,44}; // Speicher angefordert und mit Werten belegt for (int i = 0; i < 4; i++) { cout << dynarray[i] << endl; // Hier werden die WERT ausgegeben } /*-------------------------------------------------------------------------------------------------*/ int *iptr = nullptr; // Zeiger angelegt iptr = new int{ 1234 }; // Speicher angefordert und mit Werten belegt cout << iptr << endl; // Hier wird die ADRESSE ausgegeben return 0; }
Ich erhalte folgende Ausgabe:
11
22
33
44
011C4BA0Kann mir jemand erklären, warum ich mit
cout << dynarray[i] << endl;
(im oberen Teil) für die Ausgabe des Arrays die Werte der gespeicherten Elemente erhalte und mit der gleichen Syntax im unteren Teil mit
cout << iptr << endl;
die Adresse des Elements erhalte.
Müsste ich für die Ausgabe des Arrays nicht auch Adressen ausgegeben bekommen?
-
Wenn
ptr
ein Zeiger ist, dann stehtptr
für die darin gespeicherte Adresse.
*ptr
für den an dieser Stelle (Adresse) gespeicherten Wert.Mit
ptr + 1
bekommst du dann die Adresse "eins hinter" dem woraufptr
zeigt. Wennptr
auf ein Array zeigt also die Adresse des 2. Elements. Mit*(ptr + 1)
bekommst du dann den Wert des 2. Elements.Und
ptr[X]
ist bloss eine Kurzschreibweise für*(ptr + X)
. Liefert also den Wert des X-ten Elements, nicht dessen Adresse.Also
Sue schrieb:
Müsste ich für die Ausgabe des Arrays nicht auch Adressen ausgegeben bekommen?
Nein, das stimmt schon so.
-
Vielen Dank für die Erklärung!
Jetzt verstehe ich es
-
Bitte.
Steht übrigens wirklich so im Standard, also das mit*(prt+x)
.
Wie dir vielleicht auffällt sindptr
undx
in*(prt+x)
austauschbar. D.h. sie müssten auch inptr[x]
austauschbar sein. Und tatsächlich sind sie es auch. Man kann in C++ ernsthaft stattptr[123]
auch123[ptr]
schreiben. Hat mich recht amüsiert wie ich da draufgekommen bin.