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;
}
在系統源碼中也可以看到某些結構體的別名就是本身結構體的名稱,這樣做可以直接使用別名來定義結構體變量。