Pointer auf funktion



  • Ich habe mal ne frage , wenn ich einen Zeiger auf einefunktion zeigen lasse wie zum beispiel :

    int *pointer;
    int funktion(int a)
    {
    int b=a*a;
    return b;
    }
    ..
    *pointer=funktion(5);
    ...
    

    Dann zeigt der pointer auf das return ..;

    Doch was passiert wenn eine funktion eine Zeiger ist was kann man dann damit machen :

    int *funktion ()
    {
    ....
    }
    

    Bitte ein beispiel .
    Danke im voraus



  • Hallo,

    Lightning* schrieb:

    Dann zeigt der pointer auf das return ..;

    eigentlich zeigt er auf die Funktion, da er als Wert die Adresse der Funktion hat. Aber ich rede von Funktionszeigern, und du redest von einem Zeiger, der von einer Methode zurückgegeben wird, lies bitte die Links unten durch.

    Doch was passiert wenn eine funktion eine Zeiger ist was kann man dann damit machen :

    Du meintest: "Was passiert, wenn eine Funktion einen Zeiger zurückgibt?"

    Hier das Beispiel:

    //createArray gibt einen Zeiger auf int zurück
    int * createArray(size_t n) {
      int *p = new int[n];  //int-Array mit n Elementen dynamisch anlegen und zurückgeben
      return p;
    };
    
    //...
    
    //So, wenn alles glatt ging (genug Speicher frei und so), dann zeigt arr jetzt auf einen 5*int 
    //(plus ein bisserl Overhead) Speicherbereich
    int *arr = createArray(5);  
    
    for (int i=0;i<5;++i)
      arr[i] = i*i - i;  //bisserl rumspielen ;)
    
    delete [] arr;  //Speicher auch wieder freigeben!
    

    Falls du's immer noch nicht gerafft hast: http://tutorial.schornboeck.net/referenz_return.htm
    oder du liest dir meinen Artikel zum Thema durch: http://www.c-plusplus.net/forum/viewtopic-var-t-is-124532.html

    MfG

    GPC



  • Was bewirkt diese "size_t" , ich weiss nicht was das sein soll ?

    // Edit: Ein Fragezeichen reicht vollkommen. -.- (evilissimo)



  • size_t ist ein vorzeichenloser Ganzzahltyp, der groß genug ist um alle theoretisch möglichen sizeof()-Ergebnisse aufzunehmen (gehört afaik zum ANSI C Standard).

    (meist ist das ein typedef auf unsigned int oder unsigned long)



  • Lightning* schrieb:

    Ich habe mal ne frage , wenn ich einen Zeiger auf einefunktion zeigen lasse wie zum beispiel :

    int *pointer;
    int funktion(int a)
    {
    int b=a*a;
    return b;
    }
    ..
    *pointer=funktion(5);
    ...
    

    Dann zeigt der pointer auf das return ..;

    Nein, der zeigt nicht auf das return und auch nicht auf die Funktion. Er zeigt irgendwo in die Prärie (weil er nicht initialisiert ist), und du schreibst an diese Adresse den Rückgabewert der Funktion. Die Funktion ist also an dem ganzen Vorgang (der übrigens undefiniertes Verhalten erzeugt) nur ganz am Rande beteiligt.

    Ein Funktionszeiger zeigt auf die Funktion selbst. Wenn man ihn dereferenziert, bekommt man die Funktion und kann sie aufrufen:

    int funka() { return 42; }
    int funkb() { return 23; }
    int (*funktionszeiger)();
    ...
    funktionszeiger = funka;
    (*funktionszeiger)() // ergibt 42
    funktionszeiger = funkb;
    funktionszeiger() // ergibt 23, die Dereferenzierung mittels * ist implizit und kann weggelassen werden
    

Anmelden zum Antworten