Pointer-Beispiel



  • Hallo zusammen!

    Ich habe mir hier ein einfaches Pointer-Beispiel gemacht:

    int x = 6;
    	int *px;
    
    	px = &x;
    	std::cout << px << std::endl; //Adresse von x.
    	std::cout << &x << std::endl;
    
    	std::cout << *px <<std::endl; //x = 6
    
    	std::cout << &px <<std::endl; //
    

    Hierzu habe ich die Frage: Gibt mir die letzte Zeile einfach die Adresse von px zurück?

    Liebe Grüsse,
    Sonja



  • Genau. Das ist die Adresse, wo der Zeiger gespeichert ist (ist ja schliesslich auch nur eine Variable, die irgendwo gespeichert werden muss).



  • Du kannst den Zeiger auch direkt initialisieren (ist sogar gängige Praxis), also:

    int* px = &x;
    


  • Und ich würde einen Pointer wiefolgt definieren: int* ptr;
    Wenn du int *ptr; schreibst, könnte man es mit dem Dereferenzierungsoperator verwechseln.



  • EOutOfResources schrieb:

    Und ich würde einen Pointer wiefolgt definieren: int* ptr;
    Wenn du int *ptr; schreibst, könnte man es mit dem Dereferenzierungsoperator verwechseln.

    Ich würde eher sagen, dass man sich leichter tut, wenn man annimmt, dass der * zum Typ gehört, da man eigentlich nie mehrere Zeiger auf einmal definiert.



  • EOutOfResources schrieb:

    Und ich würde einen Pointer wiefolgt definieren: int* ptr;
    Wenn du int *ptr; schreibst, könnte man es mit dem Dereferenzierungsoperator verwechseln.

    Und wenn du den Stern an das int dranklebst, könntest du vergessen, daß int* px,py; nicht zwei Zeiger definiert 😉
    (dem Compiler sind die Leerzeichen egal, von daher ist der Unterschied nur eine Frage, was du besser lesen kannst)



  • Vielen Dank für eure Antworten!

    ..zur Schreibweise: Wir haben das halt so abgemacht, dass wir den Stern bei der Variable schreiben. ..obwohl: Selbst von den Tutoren wird dies nicht strikte eingehalten. Aber wie ihr sagtet: Dem Compiler ist es schlussendlich sowieso egal 😛



  • Ich hab gleich noch ein anderes Beispiel:

    Employee *staff = NULL;
    Employee *ceo = new Employee;
    staff = ceo;
    delete ceo;
    

    Ist das korrekter Code? ..wenn ich ceo lösche, hat das keine Auswirkungen auf staff?



  • SonjaZ schrieb:

    Ist das korrekter Code?

    Ja

    ..wenn ich ceo lösche, hat das keine Auswirkungen auf staff?

    auf staff nicht direkt, der zeigt immer noch auf die selbe Position. Auf das Objekt hinter staff hat das sehr wohl Einfluß (ist ja das selbe Objekt, auf das ceo gezeigt hatte und das du gerade zerstört hast).



  • Das heisst staff zeigt auf "nichts" mehr?
    ..somit sollte man die delete-Zeile also weglassen?



  • CStoll schrieb:

    ..wenn ich ceo lösche, hat das keine Auswirkungen auf staff?

    auf staff nicht direkt, der zeigt immer noch auf die selbe Position. Auf das Objekt hinter staff hat das sehr wohl Einfluß (ist ja das selbe Objekt, auf das ceo gezeigt hatte und das du gerade zerstört hast).

    -> Jeder weitere Zugriff auf das Objekt ist undefiniert (führt wahrscheinlich zu einem crash).



  • SonjaZ schrieb:

    Das heisst staff zeigt auf "nichts" mehr?
    ..somit sollte man die delete-Zeile also weglassen?

    Nicht nichts, sondern auf irgendwas. Der Speicher, wo das Objekt stand könnte bereits irgendwo anders gebraucht werden und somit kannst du keinen gültigen Zugriff mehr darauf machen.

    Entweder du hast da kein delete oder du sorgst dafür, dass der andere Zeiger auch nicht mehr auf den ungültigen Bereich zeigt.


Anmelden zum Antworten