一、結構的宣告
1、兩個無名結構體宣告的結構體變數型別不相同,不可以直接相互賦值。例如:
struct x;
struct *z;
z = &x; 這條語句是錯誤的,即使他們的成員列表完全相同。
二、幾個操作符的優先順序
1、指向結構體成員操作符->和下標引用操作符[ ]和點操作符具有相同的優先順序,結合性都是從左向右;
2、間接訪問操作符* 和 取位址符優先順序相同,它們是單目運算子,結合性從右向左,並且它們的優先順序都小於上述三個操作符。
三、結構的自引用只能引用指向其型別本身的指標,而不能是乙個完整的結構,否則會陷入無限遞迴,因為如果結構引用完整自身型別時,此時結構還沒有完全宣告,大小未確定。例如:
struct self_ref ; 這是錯誤的,但是下面的這個是正確的,因為此時b是乙個指標,占用空間大小是固定的,
struct self_ref ;
注意,下面這個宣告也是錯誤的,
typedef struct self_ref; 可以使用標籤來宣告b,例如:
typedef struct self_ref_tag self_ref; //此後,可以用self_ref來定義struct self_ref_tag 型別的結構體變數
四、結構的不完整宣告,是為了解決兩種不同的結構體型別之間的相互引用,例如:
struct b;
struct a ;
struct b ;
五、結構體的邊界對齊
1、編譯器為結構變數成員分配記憶體時要滿足邊界對齊的要求,雖然這可能會浪費部分記憶體空間。
2、根據邊界對齊要求降序排列成員列表,可以最大限度的減少浪費的記憶體空間;
3、sizeof的返回值包含了浪費的記憶體空間。
六、結構體的位段
1、位段的成員必須宣告為int 或者signed int 或者unsigned int ,並且建議盡量顯示的宣告,因為int位段被當做有符號還是無符號和具體的系統有關;
2、要注意位段中的位的最大數目,編譯器會將位段的最大的長度限制在乙個整型值得範圍內,所以乙個能夠執行在32位機器上的位段宣告可能在16位的機器上無法執行。
3,、位段的成員在記憶體中是從左向右還是從右向左分配也和具體的系統有關;
4、當乙個宣告指定了兩個位段,第二個位段比較大,無法容納於第乙個位段剩餘的位時,編譯器有可能將第二個位段放在記憶體的下乙個字,也可能直接放在第乙個位段的後面,從而能在兩個記憶體位置的邊界上形成重疊。
5、帶有位段宣告的程式要考慮移植性。
七、聯合
1、聯合的初始化,其初始值只能初始化乙個值,並且是其第乙個成員的型別,否則編譯器會嘗試強制轉換為第乙個成員的型別。
2、編譯器在對聯合型別變數進行記憶體分配時,會根據最長的成員進行分配,聯合的所有成員引用相同的記憶體位置。
3、聯合的長度就是它最大成員的長度。
以上是第十章結構和聯合的總結和摘抄,未完,待續。。。
讀書筆記之c和指標(9)
預處理器 1.編譯的第乙個階段是預處理,預處理器進行文字性質的操作 2.如果巨集定義的stuff非常長,可以把它分成幾行,除了最後一行之外,每行的末尾都要加乙個反斜槓 3.巨集替換也可以用於呼叫函式 4.define機制規定,允許把引數替換到文字中,這種實現通常稱為巨集 define name pa...
C和C指標讀書筆記
1.c中變數的儲存型別 儲存型別分為靜態儲存 普通記憶體 堆疊,暫存器自動變數即 塊內部的變數儲存於堆疊,其他變數儲存於普通記憶體即靜態儲存,如果頻繁訪問乙個變數,宣告為暫存器型別後儲存於硬體暫存器中。2.c中實體的鏈結屬性 1 屬於internal鏈結屬性的識別符號在同乙個原始檔內的所有宣告中都指...
《C和指標》讀書筆記 6
宣告 該讀書筆記摘抄自 c和指標 kenneth a.reek 著 徐波 譯 為了克服自己走馬觀花,提高閱讀和學習效率,決定將自己在讀書過程中遇到的一些知識點加以摘抄和總結備忘,在此感謝原書作者和翻譯。一 遞迴的兩個特性 1 存在限制條件 2 每次遞迴之後越來越接近限制條件 二 將二進位制數字轉換為...