一.結構體
④結構體資料的存放
⑤位段的缺點:不具有跨平台性
二.聯合體
三.列舉型別
①若沒有位段:先找預設對齊數和每個數的較小值,再在這些較小值中找出最大的,即為最大對齊數.若上個對齊數開闢的空間還有冗餘可以放下下個數,就把下個數也放在這個空間內,如果不夠放下下個數,就把下個數放到下個空間內.(當結構體中有結構體時,計算結構體大小時,結構體裡的結構體單獨計算,最後其大小加在外層結構體的大小上)
②若有位段:看各位段開闢的空間大小,能不能放下下個數.
struct stu s
;
(*a).b 等價於 a->b
結構體名.要引用的屬性名 == 讀取該結構體中要引用屬性
結構體指標->要引用的屬性名 == 讀取該結構體中要引用屬性
(結構體指標指向結構體)
struct stu s
;int
main()
;printf
("%d %d"
, s.x, s.y)
;return0;
}
vc編譯器的預設最大對齊數為8
可以用#pragma pack(4
)來重新初始化最大對齊數
用#pragma pack
()來取消剛初始化的最大對齊數
壹.不存在位段
先取結構體中各資料的大小和預設最大對齊數比,其中的較小值為該數的最大對齊數
然後比較所有資料的最大對齊數,最大的為所求
然後將各個資料塞進所求的整數倍
貳.存在位段(位段不存在跨平台性)
結構體中位段的大小和對大對齊數無關,但和位段定義的資料型別有關
struct s
;
壹.存在位段(位段不存在跨平台性)
vs編譯器中:
struct s
;int
main()
;s.a =10;
10--
-1010 因為a只用3位元位空間,所以取1010的後三位010
,放到a開闢的空間的低位址 00000/
010s.b =12;
12--
-1100 因為b用4位元位空間,所以取1100
,放到a開闢的空間中a的資料前面 0
/1100/
010s.c =3;
3---0011 因為c用5位元位空間,所以取0
0011
,放到c開闢的空間的低位址 000/0
0011
s.d =4;
4---0100 因為d用4位元位空間,所以取0100
,放到d開闢的空間的低位址 0000
/0100
printf
("%d\n"
,sizeof
(struct s));
return0;
}
壹.電腦是16位時候,如果30位位段,編不過去,機器會出問題
貳.位段中的成員在記憶體中從右往左分配空間,還是從左往右不確定
叄.當乙個結構包含兩個位段,第二個位段成員大到不能放在第乙個位段建立空間使用後的剩餘空間裡時,是捨棄剩餘的位還是繼續利用,不確定
union
u;
union u
; 取每個成員的對齊數中的最大值的整數倍
16即為該聯合體的大小
intmain()
;printf
("%d\n"
,sizeof
(union u));
return0;
}
enum color
;
enum color
;int
main()
結構體 聯合體 列舉
1 結構體struct 結構體的作用 在網路協議 通訊控制 嵌入式系統的c c 程式設計中,我們要傳送的不是簡單的位元組流 char型陣列 二是多種資料組合起來的乙個整體,其表現形式是乙個結構體。使用struct的注意事項 1 下面看乙個題目 結果 6 12 這裡涉及到結構體的記憶體對齊方式。1 關...
結構體 聯合體 列舉
結構體 1.宣告乙個結構體型別的一般形式為 struct 結構體名 成員表列 如 struct student 表示可選項 注 宣告不是定義,故不可對成員列表中的成員進行初始化。定義別名 方法一 如 struct 結構體名 typedef struct 結構體名 別名 方法二 如 typedef s...
全面了解結構體 聯合體和列舉型別
一 結構體 程式設計客棧1.定義結構體型別 struct 結構體 注意 這不是定義變數,而是自定義一種型別而已。如struct student 此處分號不能少。2.定義結構體變數。型別定義好以後,則可以定義該型別的變數。定義結構體變數 struct student a,b struct可以省略。可以...