讀《C缺陷與陷阱》之 函式宣告理解

2021-06-22 09:09:46 字數 800 閱讀 5608

在書中第2章第一節中,作者首先提到的這樣乙個函式讓我很是困惑:

(*(void(*)())0)();

這個函式的功能是這樣的:當計算機啟動時,硬體將呼叫首位址為0位置的子程式。

為什麼會有這樣的功能呢?這裡要從宣告函式說起,例如:

float ff();

這個很好理解:ff是乙個返回值為浮點型的函式。再看:

float *g(), (*h)();

由於()結合的優先順序高於*,*g()也就是*(g())。g是乙個函式,該函式返回值是乙個指向浮點數的指標。同理,可以得出h是乙個函式指標,h所指向的函式的返回值是浮點型別的。

一旦我們知道了如何宣告乙個給定型別的變數,那麼該型別的型別轉換符就很容易得到了  : 只要把宣告中的變數名和宣告末尾的分號去掉,再將剩餘的部分用乙個括號整個「封裝」起來即可。例如如下宣告:

float (*h)();

表明h是乙個指向返回值為浮點型別的函式的指標。因此

(float (*)())

表示乙個「指向返回值為浮點型別的函式的指標」的型別轉換符。

理解了以上的知識,我們就可以分析出

下面這個函式:

(*(void(*)())0)();

首先看一下這個:(void(*)()).這個就是前面所提到的型別轉換符。

它是怎樣的型別轉換符呢?

很明顯,這是乙個「指向返回這為void型別的函式的指標」的型別轉換符。

(*(void(*)())0)()是將0轉換為乙個函式指標。最外面的*是取這個函式指標的內容,即呼叫首位址為0位置的子程式。 0

給主人留下些什麼吧!~~

讀C陷阱與缺陷筆記

1.字元與字串 1 用單引號引起的乙個字元實際上代表乙個整數,整數值對應於該字元在編譯器採用的字符集中的序列值。eg 對於採用ascii字符集的編譯器而言,a 的含義與0141 八進位制 或者97 十進位制 嚴格一致。2 用雙引號引起的字串,代表的是乙個指向無名陣列起始字元的指標,該陣列被雙引號之間...

讀c陷阱與缺陷,作為自己的讀書筆記

詞法問題 1 為賦值符號 為比較符號 例如 x y是將y的值賦給x x y則是判斷x和y是否相等 這個問題我剛學程式設計甚至大學畢業的時候還是犯錯 2 和 是按位運算子 和 是邏輯運算子 3 詞法分析中的貪心法 如果輸入流截止至某個字元之前都已經被分解為乙個個符號,那麼下乙個符號將包括從該字元之後可...

C陷阱與缺陷 第五章 庫函式

有關庫函式的使用,最好的建議是盡量使用系統標頭檔案。因為標頭檔案中包括了庫函式的引數型別和返回型別的宣告。5.1 返回整數的getchar的函式 include main getchar函式一般的情況下返回的是標準輸入檔案中的下乙個字元,當沒有輸入時,返回eof。但由於 c 宣告成了char 型別,...