天天看點

深入了解C語言中的指向函數的指針和傳回指針的函數

#include

/*

* 傳回指針的函數和指向函數的指針

*/

* 定義一個函數,傳回一個void指針,在C語言中,void指針可以

* 指向任何類型

void *func(){

    /*

     * 一種很容易犯的錯誤,将局部變量的位址傳回

     */

    int m;

    printf("define as void *func()\n");

    return &m;

}

* 聲明一個指向函數的指針,指向傳回類型為void指針的函數

void *(*pfunc)();

void (*pfun)();

* 聲明一個函數,指向一個傳回void的函數。其實這個和第一種

* void *func()是大多數人最容易混淆的方式。總結中會介紹

* 分辨的方法。因為這種指針前面已經說過,這裡不舉例。

int main(){

    int *result;

    pfunc=func;/*指派*/

    result=(int *)func();/*将void*轉換成int**/

    func();

    pfunc();

    return 0;

* 編譯上面這個程式,能夠“正常”通過,但是會得到警告:傳回了臨時局部變量

* 位址,因為局部變量放在棧中,在函數結束時會被自動釋放,如果你真的想要

* 在函數中使用局部變量來傳回,那麼可以使用malloc來配置設定記憶體位址,malloc

* 配置設定的記憶體屬于程序的堆段,需要自己釋放,或者程式運作結束後由C運作時

* 來釋放。

* 最後,說說怎樣區分下面這兩個東東

*        char *func();

*        char (*func)();    

*        記住函數()的結合性比指針*高,就可以很容易區分了,因為()高于*,是以

*        char *func()中的變量func是一個函數,進一步和普通函數char func()對比

*        你就可以将char *func()中的char *看成是有一個括号括起來了。而

*        char (*func)()中的func,由于加了括号,是以先和指針*結合,變成一個

*        指針,正如普通函數char function()中的function其實也是一個函數指針

*        一樣,是以你可以将(*func)當成是一個普通變量。

繼續閱讀