1. 聯合體 (Union)

聯合體(union)是 C/C++ 中一種特殊的數據結構,它允許在同一內存位置存儲不同類型的數據。聯合體的所有成員共享相同的內存空間,但同一時刻只能存儲一個成員的值。

特點

  • 聯合體內的每個成員都有相同的內存起始地址。
  • 聯合體的大小是其最大成員的大小(即,最大佔用內存的成員)。
  • 只有一個成員能夠同時擁有值,其他成員的值被覆蓋。
#define _CRT_SECURE_NO_WARNINGS  // windows 加上這個 抑制警告!否則不能運行
#include <stdio.h>
#include <string.h>
#include <cstdlib>


union Person {
	char name[10];
	int age;
};

// 聯合體的定義和使用
int main() {
	Person p;
	p.age = 25;
	strcpy(p.name, "Xaye"); 


	// Name: Xaye, Age: 1702453592
	// 因為聯合體的所有成員共享同一塊內存區域
	printf("Name: %s, Age: %d\n", p.name, p.age);

	p = { "Xaye1" }; // 只能設置一個成員

	// Name: Xaye1, Age: 1702453592
	printf("Name: %s, Age: %d\n", p.name, p.age);


	// 聯合體大小計算,取決於最大成員的大小 不用累加 
	// 最大成員是 char name[10],佔 10 字節,因為 int age 佔 4 字節 需要對齊到 4 字節邊界,所以總大小為 10 + 2 = 12 字節
	printf("Size of Person: %zu\n", sizeof(union Person)); // 輸出 12
	 
	return 0;
}

2. 枚舉 (Enum)

枚舉(enum)是 C/C++ 中的一種數據類型,它允許定義一組具名的常數。每個枚舉值對應一個整數,默認從 0 開始遞增,但也可以手動指定值。

特點

  • 使代碼更具可讀性和可維護性。
  • 默認從 0 開始編號,也可以顯式指定枚舉常量的值。
  • 枚舉常量實際上是整數,因此可以用於邏輯運算。
#define _CRT_SECURE_NO_WARNINGS  // windows 加上這個 抑制警告!否則不能運行
#include <stdio.h>
#include <string.h>
#include <cstdlib>


// 枚舉類型的定義和使用
enum Color {
	RED,
	GREEN,
	BLUE = 5,
	YELLOW
};

int main() {
	Color c1 = RED;
	Color c2 = GREEN;
	Color c3 = BLUE;
	Color c4 = YELLOW;
	printf("c1: %d\n", c1); // 輸出 0
	printf("c2: %d\n", c2); // 輸出 1
	printf("c3: %d\n", c3); // 輸出 5
	printf("c4: %d\n", c4); // 輸出 6
	// 枚舉類型的大小通常是 int 的大小
	printf("Size of Color: %zu\n", sizeof(Color)); // 輸出 4
	return 0;
}
  • 聯合體 (Union):允許多個數據成員共享同一塊內存,適用於節省內存的場景。
  • 枚舉 (Enum):將一組相關的常量進行命名,可以使代碼更具可讀性和可維護性。

補充上篇:

結構體別名

使用 typedef 為結構體設置別名是為了簡化代碼書寫,使得在聲明結構體變量時可以省略 struct 關鍵字。

#define _CRT_SECURE_NO_WARNINGS  // windows 加上這個 抑制警告!否則不能運行
#include <stdio.h>
#include <string.h>
#include <cstdlib>

struct Worker { // 定義一個結構體,相當於java的class
	char name[10]; // 10
	int age; // 4
	double salary; // 8
};

typedef Worker Worker_, Worker_2; // 別名, 使用的時候可以不加 struct 關鍵字

// 對結構體的指針起別名


int main() {

	Worker_ worker = { "",27,50.00 };
	struct Worker worker1 = { "",27,50.00 };
	
	return 0;
}

在系統源碼中也可以看到某些結構體的別名就是本身結構體的名稱,這樣做可以直接使用別名來定義結構體變量。