Pointer und Referenzen



  • Hallo,

    mir ist immernoch nicht wirklich bewusst wie ich Pointer und Referenzen anwende und ob ich das wirklich richtig verstanden habe.
    Also, wenn ich z.B. eine int &a Referenz habe, dann wird mit einer Kopie der in a stehenden Wert weitergearbeitet und wenn ich einen int *a habe, dann wird der, sagen wir so, aktuelle Wert, also der echte Wert genommen, der an der Adresse gerade steht genommen. Also wird bei *a der Ursprungs-Wert verändert und bei &a nicht?
    Nehmen wir an, meine Erklärung ist richtig (falls nicht, bitte korrigieren, danke)
    Ich würde aber nie darauf kommen, dass auch in einem Programm dass ich schreibe zu verwenden. Also ich wüsste nicht wo.
    Könnte mir jemand vielleicht ein Paradebeispiel nennen, wo das unumgänglich ist?
    Und wieso braucht C++ Pointer und C# und Java können auch ohne?!
    Mir ist das noch nicht wirklich klar.

    Vielen Dank 🤡



  • Pointer sind Speicheradressen und (sollten) zeigen auf Objekte des jeweiligen Typs im Speicher. Mit dem -> Operator kann man auf eben jene Objekte zugreifen. Die Adresse kann auch 0/NULL sein, zeigt dann also auf kein Objekt. Kann aber auch genauso sonstwo hinzeigen, was natürlich zu Fehlern bei der Verwendung führt.

    Referenzen sind im Grunde auch Pointer. Allerdings gibt es hier kleine aber feine Unterschiede. Erst einmal dereferenziert man eine Referenz mit . statt mit -> wie es bei Pointern ja ist. Desweiteren kann eine Referenz nicht mehr verändert werden und muss bei der Initialisierung auf ein gültiges Objekt zeigen. Die Referenz kann nicht mehr "umgebogen" werden. Daher kein eine Referenz auch nie NULL sein.

    Beides fällt unter call-by-reference, wie man es aus Java zB kennt. Wobei man in Java eigentlich nur Pointer hat, keine Referenzen, und sich nicht um die Destruktion von Objekten kümmern muss.



  • Hallo

    Bei Referenzen und bei Pointern wird der Ursprungswert geändert. Nehmen wir an, dass du eine Funktion hast, der du ein Parameter übergibst und diesen in der Funktion ändern willst. Wenn du nun ganz normal eine Variable übergibst, wird von dieser eine Kopie und alle Änderung in der Funktion, an der Variable, sind beim Verlassen der Funktion "nicht mehr da". Wenn du nun eine Zeiger (also eine Adresse auf eine Variable übergibst) arbeitest du in der Funktion ja nicht direkt mit dem Zeiger, sonder dereferenzierst diesen und kannst damit in der Funktion den Wert verändern und das ganze geht auch nicht verloren. Bei Referenzen ist es ähnlich, auch da wird der Wert geändert. Referenzen und Zeiger sind sehr verwandt (lies mal im Netz) und deshalb stimmt es auch nicht, dass Java oder C# ohne Zeiger auskommen. Sie haben es nur etwas versteckt als c++ dies tut. Das ist wirklich keine vollständige Erklärung, also such mal noch bei wikipedia nach Zeiger und Referenzen , da wird das bestimmt och ausführlicher erklärt.

    chrische


Anmelden zum Antworten