#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)當成是一個普通變量。