關於《C陷阱和缺陷》中的(*(void(*)())0)()表示式的解析
阿新 • • 發佈:2019-01-26
如《C陷阱和缺陷》書中所說,表示式(*(void(*)())0)()功能主要用於模擬在計算機啟動時,作為硬體呼叫首地址為0的子程式的C語句。
對於第一次看到這個表示式的人,都會有無從下手的感覺。但通過對書中所闡述的解釋,終於一點一點理解了這個表示式。
解析如下:
1.指向函式指標的定義為:(type) (*Funcp)(),即Funcp為指向函式的指標,則(*Funcp)()為呼叫其指向函式的方式;
2.程式需要模擬硬體地址0,因此這裡將Funcp替換為0,則為(*0)()形式。這裡假如0為指向函式的指標;
3.*是指標表達形式,而0只是一個常量,不是指標,因此形如(*0)並不能生效。在這裡,0如果能被轉化為指標,那麼(*0)就相當於呼叫實際的地址。
4.關於強制轉換:1) void (*f) ()表示f指向一個返回值為void的函式指標;2) 那麼,(void (*) ())就為一個“指向一個返回值為void的函式指標”的型別轉換符。
5.將常量0通過(void (*) ())型別轉換符強制轉換為指標,這樣就可以完全使用(void (*) ())0來替換Funcp,最終表示式為
(*(void(*)())0)();
另外,typedef的使用可以是(*(void(*)())0)()更為簡潔,如下:
typedef void (*funcptr)();
(*(funcptr)0) ();