funktionsaufruf - call by ref || call by pointer



  • was ist der unterschied zwischen call by reference und call by pointer?



  • 1. Ich hab bisher bloß Call by Reference gehört
    2. Technisch gesehen das Gleiche
    3. Syntaktisch gesehen nicht das Gleiche



  • sadfjhsd schrieb:

    was ist der unterschied zwischen call by reference und call by pointer?

    Daß Du bei Zeigern bei der Verwendung * schreiben mußt und beim Aufruf &.
    Bei Referenzen braucht man das nicht, was bei der Verwendung hübsch ist, aber beim Aufruf unhübsch. Deswegen nehme ich Zeiger lieber, außer der Parameter ist konstant, dann ist const& hübscher.

    Außerdem darf es keine Referenzen auf NULL geben, weshalb ein Referenzparameter garantiert, daß es das Objekt auch gibt. Ein übergebener Zeiger könnte auf NULL (also 0) zeigen, je nach Funktion halt. Aber den Punkt halte ich für unwichtig. Die Mehrheit schwört nur auf diesen Punkt und dagt, man solle immer wenn möglich Referenzen benutzen und alle Zeiger gegen NULL prüfen.


  • Mod

    Semantisch gesehen: Keiner. In beiden Fällen wünscht man das Verhalten von call by reference
    Technisch: In einem Fall nimmt man dazu eine Referenz, im anderen einen Pointer. Hier macht es auch einen Unterschied: Referenzen und Arrays vertragen sich nicht so gut. Naja, eigentlich haben auch Pointer auf Arrays ihre Probleme. Insgesamt sind Arrays eben problematische Funktionsparameter. Aber glücklicherweise braucht man sie ja auch nur sehr selten.
    Syntaktisch: Siehe Technik, bei den Referenzen hat man die schönere Syntax.



  • Richtig interessant wirds doch erst bei Referenzen auf Zeiger, Zeigern auf Zeiger, Referenzen auf Arrays, gemischt mit (Member-)Funktions-Zeigern. 😃



  • SeppJ schrieb:

    Referenzen und Arrays vertragen sich nicht so gut. Naja, eigentlich haben auch Pointer auf Arrays ihre Probleme.

    Ja, die Syntax ist zum Heulen. Und man muß die Größe kennen, denn "int a[4]" ist ein anderer Typ als "int a[5]".

    #include <iostream>
    using namespace std;
    
    template<int size>
    void foo(double (&arr)[size]){
        for(int i=0;i!=size;++i)
            cout<<arr[i]<<' ';
        cout<<'\n';
    }
    
    template<int size>
    void bar(double (*arr)[size]){
        for(int i=0;i!=size;++i)
            cout<<(*arr)[i]<<' ';
        cout<<'\n';
    }
    
    int main(){
        double a[]={1,2,3.14};
        foo(a);
        bar(&a);
    }
    


  • int(&f(double(std::string::*)(float(&)[666])))[42];
    

    So, wer verrät mir den Typen von f? Am besten in Worten ausgeschrieben. 🙂



  • 314159265358979 schrieb:

    template <int N1, int N2, typename T1, typename T2, typename T3, typename T4>
    T1(&f(T2(T3::*)(T4(&)[N1])))[N2];
    [/cpp]
    So, wer verrät mir den Typen von f? Am besten in Worten ausgeschrieben. 🙂

    f ist 
     eine Funktion, die nimmt 
      einen Methodenzeiger der Klasse T3 auf eine Methode, die nimmt 
       eine Referenz auf ein N1 großes Array voller T4 
       und gibt zurück ein schnödes T2
      und gibt zurück eine Referenz auf ein N2 großes Array von T1.
    

    hey, Du hast mittendrin die Aufgabe geändert.



  • Wollte da die templates aus dem Spiel lassen, aber ja, richtig. 😃



  • f ist eine Funktion, die einen Methodenzeiger auf eine Methode von von std::string mit dem Rückgabetyp double, die eine Referenz auf ein float[666]-Array nimmt, nimmt, die eine Referenz auf ein int[42]-Array zurückgibt.



  • - meh -



  • Meine Lieblingstyp ist

    void (*s(void(*)()))();
    

    zumal der sogar in der Standardbibliothek benutzt wird.
    Wie lautet der Typ von s ausgeschrieben?



  • Eine Funktion, die einen Funktionszeiger void (*)() entegennimmt und einen ebensolchen zurückgibt. Etwas ähnliches wird bei der C-Standardfunktion signal benutzt, wobei es da noch etwas haarsträubender aussieht:

    void (*signal(int, void (*)(int)))(int);
    

    typedef ist euer Freund, Jungs.



  • seldon schrieb:

    Eine Funktion, die einen Funktionszeiger void (*)() entegennimmt und einen ebensolchen zurückgibt.

    Ja, es war set_new_handler.
    http://books.google.de/books?id=2soaY85jGQIC&pg=PA421&lpg=PA421&dq=set_new_handler+prototype&source=bl&ots=qea5UPIOZh&sig=61T84JZqKH4qdkD3pYWBxlpM4YM&hl=de&ei=ZDBtTe_gNoqo8AP5oKWTBQ&sa=X&oi=book_result&ct=result&resnum=3&ved=0CCoQ6AEwAg#v=onepage&q=set_new_handler prototype&f=false

    seldon schrieb:

    typedef ist euer Freund, Jungs.

    Ja. Und man findet es heute praktisch nur noch mit typedef.
    http://www.cplusplus.com/reference/std/new/set_new_handler/



  • seldon schrieb:

    Eine Funktion, die einen Funktionszeiger void (*)() entegennimmt und einen ebensolchen zurückgibt.

    Das verstehe ich nicht, kann mir das jemand zerlegen? 😕


Log in to reply