一、結構的宣告
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和指標 第六章 指標
1.指標在進行間接訪問之前,確保已被初始化。否則,會給指標分配乙個非法位址,輕則報錯,重則在毫不相干的地方報錯 指標偶爾包含合法位址 2.為了測試乙個指標變數是否為null,你可以將它與零值進行比較 3.注意 指標變數可以作為左值使用,並不是因為它們是指標,而是因為它們是變數。間接訪問指定了乙個特定...
C語言指標學習六
下面通過交換兩個數的值的例子比較,程式 在最下面,加深對指標變數的理解 swap1函式 main主函式a的值3,b的值5傳遞到是swap1,swap1的區域性變數p,q雖然在做值3和5 的交換,可是一旦交換完畢,區域性變數p和q所占用的記憶體空間會釋放掉。主函式main中的a,b仍然沒有被改變。sw...
C和指標指標
變數的值就是分配給該變數的記憶體位置所儲存的數值。int a 112 int d a 指標d指向a,但是變數d表示變數a的位址,d表示a的內容。的優先順序高於 cp 設計3個步驟 1 操作符產生cp的乙份拷貝 2 操作符增加cp的值 3 在cp的拷貝上執行間接訪問操作 char ch a char ...