理解函式宣告

2021-10-05 18:33:15 字數 1140 閱讀 8592

以前一直對複雜宣告不是很清楚,這次在書上看到接記錄一下。

一開始丟擲這樣一條令人生畏的語句:

(*(void(*)())p)();
其實並沒有那麼複雜,當我們看到如下的語句:

(*pfunc)();
我猜你一定能夠識別得出這是在通過函式指標執行它指向的函式。再看如下:

(void (*)())pfunc
我猜你一定也看得出這是把變數 pfunc 強轉為 void (*)() 型,即指向返回值型別為 void 的函式的指標型別。

綜上所述,不難看出,一開始丟擲的令人生畏的語句不過是在執行指標 p 指向的函式,只是把它強轉為 void (*)() 型。

我們可以看乙個例子:

#includeint print()

int main(void)

編譯執行可以看到,(*p)(); 和 p(); 和 (*(void(*)())p)(); 這三個語句都正常執行了,(*(void(*)())p)(); 只是執行了它指向的函式,並沒有什麼特別複雜的。ps: 其中 p() 是編譯器允許的 (*p)() 的簡寫方式,二者意義相同。

wlb@mjri3:/home/wlb/document/codes/c/study $ gcc main.c

wlb@mjri3:/home/wlb/document/codes/c/study $ ./a.out

hello world!

hello world!

hello world!

0x55603ee7a149

0x55603ee7a149

wlb@mjri3:/home/wlb/document/codes/c/study $

現代的編譯器讓我們可以減少與這樣複雜的表示式打交道。使用 typedef,執行如下程式你將得到遇上面一樣的結果。

#includetypedef int (*pfunc)();

int print()

int main(void)

理解函式宣告 signal函式的宣告

分兩步分析 假定變數fp是乙個函式指標,呼叫方法如下 fp 因為fp是乙個函式指標,那麼 fp就是該指標指向的函式,所以 fp 就是呼叫該函式的方式。ansi c標準允許程式設計師將上式簡寫為fp 的運算子高於 2.使用具體的函式指標替換fp,此處將0做型別強制轉換,轉換為函式指標,替換fp。對乙個...

如何理解signal函式宣告

signal函式用起來其實很簡單,但是回頭看看他的宣告,相信會有很多人表示費解。自己也在這個問題中糾結了好幾年了,今天終於弄明白,很是興奮,一起分享一下。先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep ...

signal函式宣告的理解

先看函式原型 void signal int signo,void func int int 對於看慣了類似unsigned int sleep unsigned int seconds 這種宣告的人們來說,signal的宣告到底是個啥啊?signal是個函式,後面應該是形參啊,但為什麼形參後面又來...