struct Student { int id; char* name; };
Student s1; // 默認初始化 (成員不初始化)
Student s2 = {1001, "Zhang"}; // 聚合初始化 (C++20 指定初始化: .id=1001)
Student s3{1002, "Li"}; // 列表初始化
char + int 中間 3 字節填充)。sizeof(Student) ≥ 成員大小之和。#pragma pack(n) 或 alignas (C++11) 控制對齊。
Student* p = &s1;
s1.id; p->id; (*p).id; // 等價
Student stu[20];
// 輸入...
sort(stu, stu+20, [](const Student& a, const Student& b){
return a.score != b.score ? a.score > b.score : a.id < b.id;
});
struct Node { int data; Node* next; };
Node* head = nullptr;
// 頭插法建表
for (int i = 9; i >= 0; --i) {
Node* p = new Node{i, head};
head = p;
}
// 遍歷
for (Node* p = head; p; p = p->next) cout << p->data << ' ';
// 銷毀
while (head) { Node* tmp = head; head = head->next; delete tmp; }
union Data { int i; float f; char c[4]; };
Data d; d.i = 0x41424344; // 'A','B','C','D' 的 ASCII
cout << d.c[0] << d.c[1] << d.c[2] << d.c[3]; // 輸出 DCBA (小端序)
struct Packet {
int type;
union { int intVal; float floatVal; char strVal[16]; }; // 直接用 intVal 訪問
};
enum Color { RED, GREEN, BLUE }; // 隱式轉 int,污染外部作用域
Color c = RED; int x = RED; // 合法但危險
enum class Color : uint8_t { RED = 1, GREEN = 2, BLUE = 4 }; // 指定底層類型
Color c = Color::RED; // 作用域隔離
// int x = Color::RED; // 編譯錯誤,需 static_cast
uint8_t val = static_cast(c); // 1
enum class Flag : uint32_t { None=0, Read=1, Write=2, Exec=4 };
constexpr Flag operator|(Flag a, Flag b) { return Flag(static_cast(a) | static_cast(b)); }
Flag perm = Flag::Read | Flag::Write; // 3
| 操作 | 單向鏈表 | 雙向鏈表 |
|---|---|---|
| 查找/遍歷 | O(n) | O(n) |
| 插入/刪除 (已知位置) | O(1) | O(1) |
| 插入/刪除 (按值查找) | O(n) | O(n) |
| 反向遍歷 | 不可 | O(n) |
頭插法建表:新節點 next = head; head = newNode; (逆序)
尾插法建表:維護 tail 指針,tail->next = newNode; tail = newNode; (正序)
插入節點 (單向,已知前驅 pre):newNode->next = pre->next; pre->next = newNode;
刪除節點 (單向,已知前驅 pre):Node* del = pre->next; pre->next = del->next; delete del;
雙向鏈表插入:同時維護 prev/next 四個指針賦值。
std::vector (動態數組)、std::list (雙向鏈表)、std::forward_list (單向鏈表)。struct Node { int data; unique_ptr next; }; 自動銷毀,無需手動 delete。std::find, std::remove_if 等配合迭代器使用。結構體/共用體/枚舉是 C++ 自定義類型基石;鏈表是理解指針、動態內存、遞歸的最佳練習。**實戰中優先用 STL 容器**,手寫鏈表僅用於教學、嵌入式無 STL 環境、或極端定製場景 (如無鎖隊列、內存池節點)。