目錄
- 枚舉
- 枚舉類型的定義
- 枚舉的優點
- 聯合(共用體)
- 聯合類型的定義
- 聯合的特點
- 聯合大小的計算
枚舉
枚舉顧名思義就是一一列舉,把可能的取值一一列舉
枚舉類型的定義
enum Day
,enum Sex
,enum Color
都是枚舉類型- {}中的內容是枚舉類型的可能取值,也叫枚舉常量
- 這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值
例如:
enum Color//顏色
{RED,GREEN,BLUE
};
int main()
{printf("RED = %d\n", RED);printf("GREEN = %d\n", GREEN);printf("BLUE = %d\n", BLUE);return 0;
}
枚舉的優點
- 增加代碼的可讀性和可維護性
- 和
#define
定義的標識符比枚舉有類型檢查,更加嚴謹。 - 便于調試
- 使用方便,一次可以定義多個常量
聯合(共用體)
聯合類型的定義
聯合也是一種特殊的自定義類型
這種類型定義的變量也包含一系列的成員
特征是:這些成員公用同一塊空間(所以聯合也叫共用體)
例如:
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{printf("%d\n", sizeof(union Un));union Un un = { 0 };printf("%p\n", &un);printf("%p\n", &(un.c));printf("%p\n", &(un.i));return 0;
}
打印結果為:
聯合類型中的成員共用一塊地址
在同一時間只能使用一個聯合類型中的成員
聯合的特點
- 聯合的成員是共用同一塊內存空間的
- 一個聯合變量的大小,至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)
例:判斷大小端存儲
union Un
{char c;int i;
};
int main()
{union Un u = { 0 };u.i = 1;if (u.c == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
也可使用匿名共用體進行判斷
int check_sky()
{union {char c;int i;}un = { .i = 1 };return un.c;
}
int main()
{int ret = check_sky();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
聯合大小的計算
- 聯合的大小至少是最大成員的大小
- 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍
例如:
union Un
{short c[7];int i;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}
打印結果為:16
分析:
- 共用體類型中的
short c[7];
需要14個字節(7(元素)*2(short
類型))
c
的對齊數為2(short
類型),VS默認的對齊數為8,所以c
成員的對齊數為2- 共用體類型中的
int i;
i
的對齊數為4(int
類型),VS默認的對齊數為8,所以i
成員的對齊數為4- 共用體中的最大對齊數為4
共用體中最大成員的大小為14,不是4的倍數,所以共用體的大小為16
對齊數在結構體詳解中的結構體的內存對齊規則中有詳細解釋