結構體
定義多個不同類型的成員變量組合在一起,以實現復雜的數據結構。
格式:
struct [標簽名] {
類型 變量名;
類型 變量名;
...
} [ 變量1={初始化}, 變量2 ...];
或者:
typedef struct{
類型 變量名;
類型 變量名;
...
} [標簽名];
示例:
struct Books {
int id;
char title[50];
char author[50];
} book;
當兩個結構體互相包含,則需要對其中一個結構體進行聲明:
//聲明
struct B;
//結構體A指向結構體B
struct A{
struct B *partner;
};
struct B{
struct A *partner;
};
位域
有些信息在存儲時,並不需要占用一個完整數據空間,而只需占幾個或一個二進制位。所謂"位域"是把字節中的二進位划分為幾個不同的區域,並說明每個區域的位數。
格式:整型 變量名 : 寬度
struct {
int a:8;
unsigned b:16; //等同於 unsigned int
int :4; // 空域,會空出4位的空間
int :4; // 空域,會空出4位的空間
signed char c;//char 保存的也是整數
} code;
值得注意的是寬度表示是的所占二進制位,不能超過它自身的類型。
如: char 占1個字節,也就是8位,所以寬度不能超過8,即: char a:9 會報錯。
如: int 占4個字節,也就是32位,所以寬度不能超過32,即: int a:33 會報錯。
整個結構體所占內存大小是最大的那數據類型的整數倍.
{
int a:32;
char b:8;
}
共計 32 + 8 = 40 / 8 = 5字節,而成員變量中占用空間最大的是int型,一個int占4個字節,而4個字節存不下,得再擴展一個int空間,所以就占8個字節了。可以通過 sizeof(變量) 去驗證結果;
共用體
定義多個不同類型的成員變量共用相同的內存空間,而內存空間只能輪流使用,內存空間大小取決於最大的那個成員變量。
union [標簽名] {
類型 變量名;
類型 變量名;
...
} [變量1, 變量2 ...];
示例:
union Student { char name[10]; int age; float weight; } boy; int main( ) { //正確使用 boy.name = "Tom"; printf( "男孩名字: %s \n", boy.name); boy.age = 20; printf( "男孩年齡: %d \n", boy.age); boy.weight = 64.5 printf( "男孩體重: %f \n", boy.weight); //錯誤使用 union Student girl; girl.name = "Ailsa"; girl.age = 20; girl.weight = 46.5 printf( "女孩: %s %d %f \n", girl.name, girl.age, girl.weight); }