1.結構體的宣告
宣告的一般形式:
struct 結構體名
;struct stu
;stu 為結構體名,它包含了5個成員,分別是name、num、age、group、score。
2.定義結構體變數
struct stu s1,s2;
struct stu
s1,s2;
上面s1,s2是結構體變數。
3.結構體變數賦值與使用
struct stu stu1 =;
struct stu stu1 =;
struct stu
s1=;
訪問結構體成員變數是使用點號操作符.
stu1.name=「tom』;
stu1.num=12;
stu1.age=18;
stu1.group=『a』;
stu1.score=136.5;
4.結構體陣列
struct student stu[5]=,,,,};
5.結構體巢狀
struct a
;struct b
;6.結構體指標
6.1結構體和結構體變數是不同的概念。
6.2結構體是一種資料型別,和我們平時的 int,float等是一樣的,編譯器不會為他們分配記憶體。
6.3結構體變數才是實實在在的資料,才需要記憶體來儲存。
struct student stu =;//結構體變數
struct student psu=&stu;//結構體指標,指向乙個結構體變數stu
//struct student pstu =student;//錯誤的寫法;
獲取結構體成員:
// .號優先順序高於,(*psu)兩邊的括號是不能少的,如果去掉括號
//就變成了 psu.name=(psu.name)
printf(「name=%s\n」,(*psu).name);
//->是乙個新的運算子,一般叫做"箭頭」,通過她接過體指標能直接取得到結構體的成員
printf(「name=%s\n」,psu->name);
結構體變數名代表的是整個集合本身,作為函式引數時傳遞的是整個集合,也就是所有的成員,而不是像陣列那樣被編譯轉換成乙個指標。如果結構體成員較多,尤其是成員維陣列時,傳送的時間和空間開銷會很大,影響程式執行效率,所以最好的辦法就是使用結構指標,這時有實參傳向形參的只是乙個位址,非常快速。
7.結構體的位域
7.1位域的定義:
有些資料在儲存時並不需要占用乙個完整的位元組,只需要占用乙個或幾個二進位制位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用乙個二進位。正是基於這種考慮,c語言又提供了一種叫做位域的資料結構。
在結構體定義時,我們可以指定某個成員變數所占用的二進位制位數(bit),這就是位域:
struct bs
;7.2位域的具體儲存規則
7.2.1相鄰成員的型別相同時
當相鄰成員的型別相同時,如果它們的位寬之和小於型別的 sizeof 大小,那麼後面的成員緊鄰前乙個成員儲存,直到不能容納為止;如果它們的位寬之和大於型別的 sizeof 大小,那麼後面的成員將從新的儲存單元開始,其偏移量為型別大小的整數倍。
struct bs
;printf("%d\n",sizeof(struct bs));
答案為4.
7.2.2相鄰成員型別不同時
當相鄰成員的型別不同時,不同的編譯器有不同的實現方案,gcc 會壓縮儲存,而 vc/vs 不會
struct bs
;printf("%d\n",sizeof(struct bs));
答案為4.
struct bs
;printf("%d\n",sizeof(struct bs));
答案為8.
這兩個就明顯的體現了gcc編譯器壓縮的特性。
7.2.3響鈴成員之間穿插著非位域成員時
如果成員之間穿插著非位域成員,會視情況進行壓縮。例如對於下面的 bs:
struct bs
;printf("%d\n",sizeof(struct bs));
答案為8.
struct bs
;printf("%d\n",sizeof(struct bs));
答案為4.
這兩個程式執行後的結果體現了gcc編譯器壓縮的特性.
7.2.4位域成員可以沒有名稱,只給出資料型別和位寬
位域成員可以沒有名稱,只給出資料型別和位寬
struct bs
;printf("%d\n",sizeof(struct bs));
無名位域一般用來作填充或者調整成員位置。因為沒有名稱,無名位域不能使用。
上面的例子中,如果沒有位寬為 20 的無名成員,m、n 將會挨著儲存,sizeof(struct bs) 的結果為 4;有了這 20 位作為填充,m、n 將分開儲存,sizeof(struct bs) 的結果為 8。
termios結構體的詳細設定
termios結構體內容 成員 描述 c cflag 控制模式標誌 c lflag 本地模式標誌 c iflag 輸入模式標誌 c oflag 輸出模式標誌 c line line discipline c cc nccs 控制字元 c ispeed 輸入波特率 c ospeed 輸出波特率在ter...
termios結構體的詳細設定
termios結構體內容 成員 描述c cflag 控制模式標誌 c lflag 本地模式標誌 c iflag 輸入模式標誌 c oflag 輸出模式標誌 c line line discipline c cc nccs 控制字元 c ispeed 輸入波特率 c ospeed 輸出波特率 在ter...
結構體的學習
結構體即結構變數。使用乙個結構體,應先宣告該結構的布局。類似於宣告變數 struct game以上 就宣告了乙個名為game的結構型別。於是我就可以在下面宣告乙個game型別的結構變數 struct game the witcher 3 在c 中struct可省略這時系統就會開闢一塊空間儲存該結構變...