[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
    011C4BA0

    Kann 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 steht ptr 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 worauf ptr zeigt. Wenn ptr 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 sind ptr und x in *(prt+x) austauschbar. D.h. sie müssten auch in ptr[x] austauschbar sein. Und tatsächlich sind sie es auch. Man kann in C++ ernsthaft statt ptr[123] auch 123[ptr] schreiben. Hat mich recht amüsiert wie ich da draufgekommen bin.


Anmelden zum Antworten