typedef和巨集文本替換的重要區別:
首先,可以用其它型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不能這樣做。
其次,在連續幾個變數的宣告中,用typedef定義的型別能夠保證宣告中所有的變數均為同一種型別,而用#define定義的型別則無法保證。
編譯器位於編譯過程的哪乙個階段?
絕大多數編譯器並不是乙個單一的龐大程式。它們通常是由六七個稍小的程式所組成,這些程式由乙個叫做「編譯器驅動器的控制程式來呼叫」。分離出來的單獨程式包括:與處理器、語法和語義檢查器、**生成器、匯程式設計序、優化器、聯結器,當然還包括乙個呼叫所有這些程式並向各個程式傳遞正確選項的驅動器程式。優化器幾乎可以載入上述所有階段的後面。
如果函式庫的乙份拷貝是可執行檔案的物理組成部分,我們稱之為靜態鏈結,如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找所需要的函式庫,那麼我們稱之為動態鏈結。
動態鏈結可執行檔案比功能相同的靜態鏈結可執行檔案的體積小。
所有動態連線到某個特定函式庫的可執行檔案在執行時共享該函式庫的乙個單獨拷貝。動態鏈結庫由鏈結編輯器ld建立。根據約定,動態庫的擴充套件名為「.so」,表示「shared object(共享物件)」——每個連線到該函式庫的程式共享它的同乙份拷貝。
作為80x86記憶體模型最基本的形式 ,8086中的段是一塊64k的記憶體區域,由乙個段暫存器所指向。記憶體位址的形成經過是:取得段暫存器的值,左移4位,或者換種思路,把段暫存器的值看成是20位的,也就是在值的右邊擴充4個0。然後就是16位的偏移位址,它表示段內的位址。如果把段暫存器的值(經過移位) 。
你可以分配多大的記憶體:
//
#include #include int main(void)
//
什麼時候陣列和指標是相同的
規則一:表示式中的陣列名(與宣告不同)被編譯器當作乙個指向指向該書組第乙個元素的指標。
規則二:下標總是與指標的偏移量相同。
規則三:在函式引數的宣告中,陣列名被編譯器當作指向該陣列第乙個元素的指標。
C專家程式設計學習筆記 2
第4章 令人震驚的事實 陣列和指標並不相同 1.區別定義和宣告 宣告相當於普通的宣告 它所說明的並非自身,而是描述其他地方的建立的物件.定義相當於特殊的宣告 它為物件分配記憶體 2.當書寫了extern char p,然後用p 3 來引用其中的元素時,編譯器將會 1 取得符號表中p的位址,提取儲存與...
《C專家程式設計》學習筆記2
乙個 l的 nul用於結束乙個ascll字串 兩個l 的null 用於表示什麼也不指向的指標 標準的c編譯器至少允許一條switch語句中有257個case標籤。為了滿足乙個8bit的字元的所有情況。switch的另乙個問題是它內部的任何語句都可以加上標籤,並在執行時跳轉到 這就有可能破壞程式流的結...
C專家程式設計(一)
第一章 c 創越時空的迷霧 1 根據編譯器設計思路發展的語言特性 1 陣列下標從0開始,基於偏移量。2 表示式中陣列名可看作是指標,作為函式引數,陣列隱式轉換為指標,不需要複製陣列內容。2 c預編譯 1 字串替換 foo bar 2 標頭檔案包含 h 3 通用 模板擴充套件 巨集的實際引數只是原樣輸...