Verständnisproblem bzgl. Pointer, Referenzen, call by value, call by reference



  • Hallo,

    ich habe ein Verständnisproblem. Als Beispiel hier eine einfache Funktion.

    int foo(int a, int b)
    {
       return a + b; 
    }
    

    Diese Funktion kann ich ja ganz einfach aufrufen, nämlich so:

    int main()
    {   
        printf("%i", foo(5, 10)); 
        return 0;
    

    Nun die gleiche Funktion, allerdings nicht call-by-value, sondern mit Zeigern:

    int foo(int* a, int* b)
    {
       return *a + *b; 
    }
    

    Aufrufen kann ich diese Funktion folgendermaßen:

    int main()
    {   
        int a = 5; 
        int b = 10; 
        printf("%i", foo(&a, &b)); 
        return 0;
    

    Durch das "&" übergebe ich der Funktion jeweils eine Adresse der Variablen, und greife dann in der Funktion auf den Wert mithilfe eines Pointers zu.

    Soweit so gut. Meiner Meinung nach versteht man jetzt unter der ersten Funktion call-by-value, und die zweite Version der Funktion call-by-reference.

    Was allerdings ist so etwas wie unten:

    int foo(int const& a, int const& b)
    {
        return a + b; 
    }
    

    Aufrufen kann ich diese Funktion folgendermaßen:

    int main()
    {   
        int a = 5; 
        int b = 10; 
        printf("%i", foo(a, b)); 
        return 0;
    

    Übergebe ich in diesem Fall der Funktion eine Referenz auf die Variablen im main-Programm? D.h. in der Funktion kann ich ganz normal mit den Variablen arbeiten, als wäre es call-by-value gewesen? Also ohne Zeiger derefernzieren zu müssen z.B.. Und durch den const-Qualifizierer kann ich sicher stellen, dass in der Funktion die Werte der Variablen auf gar keinen Fall geändert werden können?

    Quasi die Sicherheit, die mir call-by-value sowieso schon bietet, weil dabei ja eine lokale Kopie der Variablen erzeugt wird.

    Ist dann der Vorteil von der letzten Methode die Performance? Wird dabei keine lokale Kopie angelegt?

    Wie nennt man das letzte Beispiel? Also das erste ist ja meiner Meinung nach call-by-value, das zweite ist call-by-reference, und das dritte weiß ich eben nicht.

    Kann jemand Licht ins dunkel bringen?

    Danke!



  • Die erste Variante ist call by value, unbestritten.

    Die dritte Variante ist call by reference. Referenzen sind dabei ein spezielles C++-Konstrukt, über das Du sicherlich in jedem anständigem Buch bzw. jedem anständigen Tutorial mehr erfahren kannst.

    Variante 2 ist, auf Ebene des erzeugten Maschinencodes betrachtet, nicht oder kaum von Variante 2 zu unterscheiden, benutzt abeer Zeiger dazu, was als eine Art Generalisierung von Referenzen verstanden werden kann. Kurz: Man kann mit Referenzen nichts machen, was man mit Zeigern nicht auch machen könnte, sondern nur eine Untermenge davon; allerdings oft komfortabler und weniger fehleranfällig. Vereinfacht gesagt ist Variante 2 also auch eine Art call by reference.



  • Friedel_1963 schrieb:

    int foo(int const& a, int const& b)
    

    1. Übergebe ich in diesem Fall der Funktion eine Referenz auf die Variablen im main-Programm?

    2. D.h. in der Funktion kann ich ganz normal mit den Variablen arbeiten, als wäre es call-by-value gewesen?

    3. Also ohne Zeiger derefernzieren zu müssen z.B.. Und durch den const-Qualifizierer kann ich sicher stellen, dass in der Funktion die Werte der Variablen auf gar keinen Fall geändert werden können?

    4. Quasi die Sicherheit, die mir call-by-value sowieso schon bietet, weil dabei ja eine lokale Kopie der Variablen erzeugt wird.

    5. Ist dann der Vorteil von der letzten Methode die Performance? Wird dabei keine lokale Kopie angelegt?

    1. Ja 2. Jein (es ist nicht call by value) 3. Ja 4. Ja 5. Ja



  • Wobei sich der Performancevorteil besonders bei grösseren Objekten (Klasseninstanzen) auszahlt, da diese länger zum Kopieren brauchen und Konstruktoraufrufe getätigt werden müssen. Bei einigen Klassen ist eine Kopie auch gar nicht möglich (beispielsweise den C++-Streams).


Anmelden zum Antworten