Verständnisproblem mit Zeigern



  • Abend,

    ich schlage mich zur Zeit mit Zeigern in C++ rum, aber komme irgendwie nicht weiter. Zur Verdeutlichung habe ich mir mal selber ein kleines Beispiel programmiert, wo einem Zeiger eine Adresse einer Variable zugewisen wird. Soweit so gut - es funktioniert.
    Aber ich verstehe nicht, wenn ich bei einem Dereferenzierungsoperator(*) die Adresse ausgeben lasse warum diese anders als der Zeiger selbst ist. Warum ist das so?

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int i;
        int *z;
    
        i = 10;
    
        cout << "i = " << i << endl; // Ausgabe des Wertes (i)
        cout << "&i = " << &i << endl; // Ausgabe der Addresse (i)
    
        z = &i; // Der Variable z die Adrsse der Variable i zuweisen
    
        cout << "z = " << z << endl; // Ausgabe von z
    
        // Hier diese Zeile
        cout << "&z = " << &z << endl; // Ausgabe der Audresse der Variable z
    
        // Zum vergleich die Ausgabe beider Adressen(i und z)
        cout << endl << endl << endl;
    
        // Beide Adressen sind gleich!
        cout << &i << endl;
        cout << z << endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich hoffe ihr versteht was ich meine. 🙂

    Dummkopf 😕



  • Dummkopf schrieb:

    Ich hoffe ihr versteht was ich meine. 🙂

    Nicht wirklich. Zum einen sagst du, die Adressen seien gleich, zum anderen fragst du, weshalb sich die Adresse vom Zeiger unterscheidet.

    Es ist so: Ein Zeiger ist ein Datentyp, der eine Adresse (ein Integer im Hex-Format) speichert. Diese Adresse kann 0 sein (was den Zeiger als ungültig ausweist) oder die eines bestimmten Objektes. In letzterem Fall sagt man, der Zeiger zeige/verweise auf das Objekt.

    Bei deinem Beispiel müssen der Zeiger z und die Adresse &i ja gleich sein, weil du sie einander zuweist.



  • Bedeutet das also, wenn der Datentyp, hier int, 4 Bytes groß ist, dass dementsprechend die Differenz des Zeigers zwischen

    cout << z << endl;
    

    und

    cout << &z << endl;
    

    auch 4 Bytes groß ist?

    Hab ich das so richitig verstanden?



  • Bitte drücke dich mal verständlich aus.

    Was meinst du mit "Differenz des Zeigers zwischen zwei Anweisungen"?



  • Der Datentyp Integer ist 4 Byte groß. Wenn ich nun folgendes folgendes auf der Konsole ausgebe:

    cout << z << endl;
    cout << &z << endl;
    

    erscheint bei mir:

    z = 0x22ff74
    &z = 0x22ff70

    Entspricht nun die Differenzen zwischen der 1. und der 2. Ausgabe dem Integer(4 Bytes) ?

    Besser ausgedrückt?



  • Ja, besser ausgedrückt. 🙂

    Nein, das hat nichts mit dem Integer selbst zu tun, sondern mit der Adresslänge im Arbeitsspeicher. Unter 32-Bit-Systemen ist eine Adresse 4 Byte lang, also "zufälligerweise" wie int . Zeiger brauchen also 4 Byte, um ihre Adresse zu speichern.

    Mit &z greifst du aber auf die Adresse des Zeigers z zu, hast also einen Zeiger auf einen Zeiger auf int .



  • Danke dir! Jetzt hab ich das verstanden. Vielen Dank 😋 👍

    Dummkopf



  • Bitte. Ich empfehle dir, zusätzlich noch den Artikel über Zeiger nachzulesen, um dich noch besser einzuarbeiten. 😉



  • Cool! Vielen vielen Dank nochmals! 🙂

    Dummkopf


Anmelden zum Antworten