日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言自定義類型——枚舉,聯合體

作者:期邈云漢 更新時間: 2022-09-22 編程語言

目錄

  • ?? 枚舉
    • ?? 枚舉類型定義
    • ?? 如何使用?
  • ?? 聯合(共用體)
    • ?? 定義聯合體
    • ?? 考慮改進判斷大小端實現
    • ?? 聯合大小的計算


?? 枚舉

枚舉顧名思義就是一一列舉(一 一舉例出來)

把可能的取值列舉
比如說:

一周的星期一到星期日是有限的7天,可以一 一列舉

性別有:男、女、保密,也可以一一列舉

月份有12個月,也可以一一列舉
等等....

?? 枚舉類型定義

{ } 中的內容是枚舉類型的可能取值,也叫 枚舉常量

//枚舉類型
enum Color {
	Red,
	Green,
	Bule
};
enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性別
{
	MALE,
	FEMALE,
	SECRET
};
int main() {
	//創建變量
	enum Color co = Bule;  //即co表示藍色

	printf("%d\n", Red);
	printf("%d\n", Bule);
	printf("%d\n", Green);
	return 0;
}

在這里插入圖片描述
結果表明這些每一個枚舉可能取值都是常量,也稱枚舉常量,不能修改。但是這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值來修改初始值。

Red = 5;

在這里插入圖片描述

?? 如何使用?

為什么使用枚舉?

我們可以使用 #define 定義常量,為什么非要使用枚舉?

枚舉的優點

  1. 增加代碼的可讀性和可維護性
  2. 和#define定義的標識符比較枚舉有類型檢查,更加嚴謹
  3. 防止了命名污染(封裝)
  4. 便于調試
  5. 使用方便,一次可以定義多個常量
int main() {
	//創建變量
	enum Color co = Bule;  //即co表示藍色

	printf("%d\n", Red);
	printf("%d\n", Bule);
	printf("%d\n", Green);
	printf("%d\n", sizeof(co));
	return 0;
}

在這里插入圖片描述

這里得到其大小為4,因為枚舉常量只是保存一個具體枚舉常量值,而不是整個枚舉類型。


enum Color//顏色
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;//只能拿枚舉常量給枚舉變量賦值,才不會出現類型的差異。

clr = 5;  //這樣賦值顯然是會報錯的!
//要盡量避免這樣的寫法

?? 聯合(共用體)

聯合也是一種特殊的自定義類型。

這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(所以聯合也叫共用體)。


?? 定義聯合體

//聯合類型的聲明
union Un
{
 char c;
 int i;
};
//聯合變量的定義
union Un un;
//計算變量的大小
printf("%d\n", sizeof(un));

在這里插入圖片描述

int main() {
	//聯合變量的定義
	union Un un;
	//計算變量的大小
	printf("%p\n", &un);
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));
	
	printf("%d\n", sizeof(un));
	printf("%d\n", sizeof(union Un));
}

在這里插入圖片描述

上述例子表明聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大

小(因為聯合至少得有能力保存最大的那個成員)


?? 考慮改進判斷大小端實現

//改進大小端判斷(考慮聯合體)
int check() {
	union un {
		int i;
		char c;
	}u;
	u.i = 1;
	return u.c;
}
int main() {
	int ret = check();
	if (ret == 1)
		printf("小端!\n");
	else
		printf("大端!\n");
	return 0;
}

在這里插入圖片描述


?? 聯合大小的計算

  • 聯合的大小至少是最大成員的大小。

  • 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。

比如:

union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};

printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));

在這里插入圖片描述

聯合體公用同一塊空間,short [7] 占用14個字節,那么最大對齊數為8;int 4個字節,最大對齊數8,

最終對齊數為4,取所有類型對齊數最大的,那么根據規則,就會占用4的整數倍個字節。


原文鏈接:https://blog.csdn.net/qq_52295022/article/details/126978551

欄目分類
最近更新