[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
ptrein Zeiger ist, dann stehtptrfür die darin gespeicherte Adresse.
*ptrfür den an dieser Stelle (Adresse) gespeicherten Wert.Mit
ptr + 1bekommst du dann die Adresse "eins hinter" dem woraufptrzeigt. Wennptrauf 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 sindptrundxin*(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.