Funktionszeiger



  • Habe gerade hier was über Funktionszeiger gelesen und war über folgendes erstaunt:

    int multiplication(int a, int b){
       return a*b;
    }
    //[...]
    int x;
    x = (*multiplication)(40, 8); // ruft multiplication() auf und weist x den Rückgabewert zu
    x = multiplication(40, 8);    // alternative (nicht empfohlene) Syntax
    

    Die "alternative" Version ist doch das was man immer schreiben würden wenn man die Funktion multiplication aufruft, oder hat das jetzt speziell was mit dem Thema Funktionszeiger zu tun, dass der Autor meint es wäre die nicht empfohlene Variante?



  • Was hat dein Beispiel mit dem im Link zu tun?



  • 😕

    multiplication ist hier doch kein Zeiger. Wenn du (*multiplication) machst, brauchst du erstmal einen Funktionzeiger, diese Konvertierung passiert automatisch. Dann dereferenzierst du und landest wieder bei der Funktion. Das Spiel kannst du auch weiter treiben (*******multiplication) , haha. Dass eine Konvertierung in einen Funktionszeiger automatisch passierst, siehst du auch daran, dass du den Adressoperator bei der Initialisierung eines Funktionszeigers nicht brauchst: rechenoperation = multiplication;

    Und das untere ist ein normaler Funktionsaufruft. Der Kommentar dahinter ist doch Murx.



  • Das ist da gemeint:

    #include <iostream>
    
    int multiplication(int a, int b){
        return a*b;
    }
    
    int division(int a, int b){
        return a/b;
    }
    
    int main(){
        int (*rechenoperation)(int, int) = 0; // Anlegen eines Funktionszeigers, Initialisierung mit 0
        rechenoperation = &multiplication;
    
        int x;
        x = (*rechenoperation )(40, 8); // ruft multiplication() auf und weist x den Rückgabewert zu
        x = rechenoperation (40, 8);    // alternative (nicht empfohlene) Syntax
    }
    

    Ist aber Quatsch. Ich habe noch nie davon gehört, dass das mit dem expliziten Sternchen für irgendjemanden besser lesbar ist. Ich finde es sogar eher verwirrend, weil ein Funktionszeiger ganz anders benutzt wird als ein Zeiger auf ein Objekt.



  • TyRoXx schrieb:

    Ich habe noch nie davon gehört, dass das mit dem expliziten Sternchen für irgendjemanden besser lesbar ist.

    Ich mag sie. 😋

    Aber eigentlich egal. Ich mag den komplizierten Typen "int (*rechenoperation)(int, int) =" nicht so arg.

    #include <iostream>
    
    int multiplication(int a, int b){
        return a*b;
    }
    
    int division(int a, int b){
        return a/b;
    }
    
    typedef int rechenoperation_t(int a,int b);
    
    int main(){
        rechenoperation_t* p_rechenoperation = 0;
    
        p_rechenoperation = &multiplication;
    
        int x;
        x = (*p_rechenoperation )(40, 8); // ruft multiplication() auf und weist x den Rückgabewert zu
        x = p_rechenoperation (40, 8);    // alternative (nicht empfohlene) Syntax
    }
    


  • auto to the rescue. 😉



  • volkard schrieb:

    TyRoXx schrieb:

    Ich habe noch nie davon gehört, dass das mit dem expliziten Sternchen für irgendjemanden besser lesbar ist.

    Ich mag sie. 😋

    Warum?

    p_rechenoperation ist ein functor. Wie er implementiert ist, ist mir ja eigentlich egal. Könnte ja genausgut eine Klasse sein oder sonstwas. Solange ich op() aufrufen kann passt das ja.

    Also ich mag den unnötigen * hier definitiv nicht.

    Das typedef dagegen, mag ich sehr wohl.


Anmelden zum Antworten