分兩步分析:
假定變數fp是乙個函式指標,呼叫方法如下:(*fp)();
因為fp是乙個函式指標,那麼*fp就是該指標指向的函式,所以(*fp)()就是呼叫該函式的方式。ansi c標準允許程式設計師將上式簡寫為fp()。()的運算子高於*。
2.使用具體的函式指標替換fp,此處將0做型別強制轉換,轉換為函式指標,替換fp。
對乙個常數進行型別轉換,只需在變數宣告中將變數名去掉即可。如果fp是乙個指向返回值為void型別的函式的指標,那麼(*fp)()的值為void,fp的宣告如下:
void (*fp)();將變數名去掉,將0轉換為"指向返回值為void的函式的指標"型別這樣寫:(void(*)())0
因此,可以用(void(*)())0替換fp,從而得到:
(*(void(*)())0)();
使用typedef宣告更加便於理解。
typedef void(*funcptr)(); //相當於typedef void (*)() funcptr
((*funcptr)0)();
從三個方面理解:返回值型別、函式指標以及引數。
signal函式的返回值型別是乙個指向呼叫前的使用者定義訊號處理函式的指標,
假定特定訊號處理函式的宣告如下:
void sigfunc(int);
假定sfp為指向sigfunc的函式指標,則*sfp就代表了sigfunc函式,因此可以如下宣告sfp:
void (*sfp)(int);
signal的引數列表是(int,sigfunc), 返回值是sigfunc,所以signal可以宣告如下:
sigfunc signal(int, sigfunc)
替換sigfunc,即:void(*sfp)(int) signal(int, void(*sfp)(int))
去掉變數名,即:void (*)(int) signal(int, void(*)(int))
調順序,即:void (*signal(int, void(*)(int)))(int)
使用typedef宣告更加便於理解。
typedef void (*handler) (int);
handler signal (int, handler);
signal函式宣告的理解
先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep unsigned int seconds 這種宣告的人們來說,signal的宣告到底是個啥啊?signal是個函式,後面應該是形參啊,但為什麼形參後面又來...
如何理解signal函式宣告
signal函式用起來其實很簡單,但是回頭看看他的宣告,相信會有很多人表示費解。自己也在這個問題中糾結了好幾年了,今天終於弄明白,很是興奮,一起分享一下。先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep ...
簡單理解函式宣告 以signal函式為例
signal 幾乎所有c語言程式的實現過程中都要用到signal函式,作為捕獲不同步的一種方式。我們使用者要呼叫signal函式,可以這樣使用,首先在標頭檔案中加入 include,然後我們可以這樣呼叫signal函式 signal signal type,sighandler t hander 這...