一、結構體
1.結構體的宣告及定義:
(1)宣告乙個student的型別
struct student
;struct student std1;
// 定義結構體變數std1
(2)用typedef 對結構體宣告
typedef
struct student
student;
student std1;
//定義結構體變數std1
2.結構體的初始化和成員訪問
(1)結構體初始化
struct student std1 =
;//初始化
student std1 =
;//初始化
(2)結構體的成員訪問
typedef
struct student
student;
intmain()
;//初始化
printf
("%s %d %s %s\n"
, std1.name, std1.age, std1.***, std1.id)
;//結構體訪問
system
("pause");
return0;
}
利用結構體指標訪問成員變數:
定義結構體指標指向定義的std1,通過指針對結構體成員進行訪問。
#define _crt_secure_no_warnings 1
#include
#include
//struct student
//;typedef
struct student
student;
intmain()
;//初始化
//printf("%s %d %s %s\n", std1.name, std1.age, std1.***, std1.id);
student* ps =
&std1;
printf
("%s %d %s %s\n"
, ps->name, ps->age, ps->***, ps->id)
;system
("pause");
return0;
}
3.結構體內存對齊
第乙個成員在與結構體變數偏移量為0的位址處。
其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。
vs中預設的值為8
linux中的預設值為4
結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所 有最大對齊數(含巢狀結構體的對齊數)的整數倍。
二、共用體(聯合體)
聯合也是一種特殊的自定義型別 這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間(所以 聯合也叫共用體)
(1)聯合體宣告及定義
union un
;//聯合變數的定義
union un un;
//計算連個變數的大小
printf
("%d\n"
,sizeof
(un)
);
從輸出的大小可以看出各個成員共用乙個記憶體空間
(2)聯合體應用舉例
判斷當前機器的大小端問題:
#define _crt_secure_no_warnings 1
#include
#include
intcheck_sys()
u; u.i =1;
return u.c;
}int
main()
(3)聯合大小的計算
聯合的大小至少是最大成員的大小。
當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
#define _crt_secure_no_warnings 1
#include
#include
union un1
;union un2
;int
main()
C 聯合體(共用體)
所佔的空間大小為成員中所佔空間最大的 union 聯合名 union a 使用該聯合體模板建立兩個變數a,b union a a,b union perdata a,b union a,b typedef int length length為int 型別的別名 length a,b a,b為int ...
C語言union 聯合體 共用體
一直以來,union都是個很少用到的東西,對於這些不常用的結構往往記不住。這次看書又看到了,還是學習一下吧。一般在windows api的一些資料結構中才能看到這個union,其實並不複雜。本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。1 union中可以定義多個成員,union的大小由最...
C語言union 聯合體 共用體
一直以來,union都是個很少用到的東西,對於這些不常用的結構往往記不住。這次看書又看到了,還是學習一下吧。一般在windows api的一些資料結構中才能看到這個union,其實並不複雜。本質上來說和結構體是一樣的,但是從包裝的角度來看有差異。1 union中可以定義多個成員,union的大小由最...