Zeigervariable an eine Funktion übergeben: pass by ?



  • C++ bietet ja bekanntlich 2 Arten, wie man eine Variable an eine Funktion übergeben kann: Zum einen pass by value und zum anderen pass by reference.

    Jetzt sehe ich aber immer wieder Leute, die die Übergabe einer Zeigervariablen

    void fkt(int*);
    

    als pass by reference bezeichnen, womit ich aber gar nicht einverstanden bin. Immerhin bezeichnet ja

    • pass by value, dass das Original kopiert wird und demnach nicht verändert werden kann.
    • pass by reference, dass das Original nicht kopiert wird, sondern man eine Referenz auf das Original erhält und das Original somit verändern kann.

    Und das Original ist hierbei ja die Zeigervariable (und nicht das Objekt auf den der Zeiger verweist) und diese wird kopiert und somit kann das Original bei Gott nicht verändert werden. Darum ist es doch schlichtweg falsch, so etwas als pass by reference zu bezeichnen, oder wie seht ihr das?

    [edit: hatte mich im letzen Satz voll verschrieben.]



  • Referenzen sind im wesentlichen normalerweise Zeiger.



  • Gugelmoser schrieb:

    C++ bietet ja bekanntlich 2 Arten, wie man eine Variable an eine Funktion übergeben kann: Zum einen pass by value und zum anderen pass by reference.

    Jetzt sehe ich aber immer wieder Leute, die die Übergabe einer Zeigervariable

    void fkt(int*);
    

    als pass by reference bezeichnen, womit ich aber gar nicht einverstanden bin. Immerhin bezeichnet ja

    • pass by value, dass das Original kopiert wird und demnach nicht verändert werden kann.
    • pass by reference, dass das Original nicht kopiert wird, sondern man eine Referenz auf das Original erhält und das Original somit verändern kann.

    Und das Original ist hierbei ja die Zeigervariable (und nicht das Objekt auf den der Zeiger verweist) und diese wird kopiert und somit kann das Original bei Gott nicht verändert werden. Darum ist es doch schlichtweg falsch, so etwas als pass by value zu bezeichnen, oder wie seht ihr das?

    Du hast vollkommen Recht. Die Übergabe per Zeiger ist schlicht der Nachbau
    von pass-by-reference in einer Sprache (C), die eigentlich kein pass-by-reference kennt. ABER darauf zu bestehen ist ein Kampf gegen Windmühlenflügel und Klugscheißer kann keiner leiden.



  • Wenn ich die Wahl zwischen Pass by Value und Pass by Reference hätte, würde ich mich bei Zeigern ebenfalls für ersteres entscheiden. Zeiger sind im Gegensatz zu Referenzen Objekte, wie jedes andere C++-Objekt auch. Und diese Sichtweise ist auch die einzig konsistente, da ansonsten bei Smart-Pointers, Iteratoren, etc. jeweils unklare Grenzen bestehen.

    Selbst verwende ich diese Ausdrücke relativ selten, ich würde eher von "[Zeiger/Referenz auf] Objekt übergeben" sprechen.



  • Bei void fkt(int*); habe ich den int* by value übergeben und gleichzeitig den int by reference.
    Da es wohl um den int geht, würde ich in der Klausur by reference ankreuzen.



  • volkard schrieb:

    Bei void fkt(int*); habe ich den int* by value übergeben und gleichzeitig den int by reference.
    Da es wohl um den int geht, würde ich in der Klausur by reference ankreuzen.

    Behälst du diese Argumentation auch bei void* ?



  • Michael E. schrieb:

    volkard schrieb:

    Bei void fkt(int*); habe ich den int* by value übergeben und gleichzeitig den int by reference.
    Da es wohl um den int geht, würde ich in der Klausur by reference ankreuzen.

    Behälst du diese Argumentation auch bei void* ?

    Klar, warum nicht?



  • volkard schrieb:

    Klar, warum nicht?

    Du kannst dann einen void mit Pointern by reference übergeben, aber nicht mit Referenzen by reference. Find ich nicht schön.



  • volkard schrieb:

    Bei void fkt(int*); habe ich den int* by value übergeben und gleichzeitig den int by reference.
    Da es wohl um den int geht, würde ich in der Klausur by reference ankreuzen.

    Kreuz doch einfach "by value" an und schreib (für den Pointer) dahinter und kreuz "by reference" an und schreibt (für den int) dahinter 😃



  • Michael E. schrieb:

    volkard schrieb:

    Klar, warum nicht?

    Du kannst dann einen void mit Pointern by reference übergeben, aber nicht mit Referenzen by reference. Find ich nicht schön.

    Zeig mir mal einen void.
    Ich denke, der void* wird nur verwendet, um zum Beispiel einen int by reference zu übergeben.





  • volkard schrieb:

    Michael E. schrieb:

    volkard schrieb:

    Klar, warum nicht?

    Du kannst dann einen void mit Pointern by reference übergeben, aber nicht mit Referenzen by reference. Find ich nicht schön.

    Zeig mir mal einen void.

    Den musst du mir zeigen, wenn du für void keine Ausnahme deiner Regel einführen willst. Du siehst also, dass Inkonsistenzen auftreten.

    Ich denke, der void* wird nur verwendet, um zum Beispiel einen int by reference zu übergeben.

    Verstehe ich nicht. Wo wird void* verwendet?



  • Michael E. schrieb:

    Verstehe ich nicht. Wo wird void* verwendet?

    Erinnere Dich an generische Funktionen in C.
    Der void* wird verwendet, um den echten Typ, auf den gezeigt wird, nicht verraten zu müssen.
    Und mit diesem Wissen sehe ich eben keine Inkonsistenz. Und selbst wenn, ich würde die Meinung des Profs treffen und die 1 schreiben.



  • volkard schrieb:

    Michael E. schrieb:

    Verstehe ich nicht. Wo wird void* verwendet?

    Erinnere Dich an generische Funktionen in C.
    Der void* wird verwendet, um den echten Typ, auf den gezeigt wird, nicht verraten zu müssen.
    Und mit diesem Wissen sehe ich eben keine Inkonsistenz.

    Siehst du "void" also nur als Platzhalter für den richtigen Typen? Dann wird das System also noch ein wenig komplizierter. Du siehst also, dass es deutlich einfacher wäre, Pointerübergabe als Wertübergabe zu betrachten.

    Und selbst wenn, ich würde die Meinung des Profs treffen und die 1 schreiben.

    Das kommt sicherlich auf den Prof an.



  • Ich staune hier im Unterforum C++ immer wieder neu, wenn es um simple Grundlagen von C geht. Diese gehören implizit auch zu C++, obwohl man sie in C++ nicht mehr braucht.

    ➡ pass by value: Es wird der Funktion der Wert übergeben. Die Funktion erhält den Wert, kann ihn verwenden, aber nicht verändern.
    ➡ pass by reference: Es wird der Funktion der Zeiger auf einen Wert übergebenen. Die Funktion kann den Wert dereferenzieren, verwenden, und verändern.
    ➡ Eine Referenz ist auch eine Variable, nämlich eine Position im Speicher. Wenn man weiss, was dort drinsteht, kann man damit sehr viel anfangen.

    Bitte Bücher, Dokumentationen, oder Tutorials lesen. Ist doch überall alles mit Beispielen bestens erklärt!

    daddeldu! :p



  • berniebutt schrieb:

    ➡ pass by reference: Es wird der Funktion der Zeiger auf einen Wert übergebenen.

    Nein. Eine Referenz ist kein Zeiger.

    ➡ Eine Referenz ist auch eine Variable, nämlich eine Position im Speicher.

    Nein, das fordert der Standard nicht.



  • Referenzen sind nicht mal Objekte. Referenzen sind Namen. Sie müssen nicht mal im Speicher vorhanden sein.



  • Es gibt auch Leute, die behaupten, Werte (resp. Literale) seien Objekte. Alles eine Frage der Perspektive also.



  • Es gibt auch Leute, die Jürgen Wolf vergöttern. Dadurch wird er nicht besser.



  • Und was hat das miteinander zu tun? Stellst du Smalltalk-Programmierer auf eine Stufe mit JW? Diffamierend 🙂


Anmelden zum Antworten