for (init; cond; step) body;
// 1. init (僅一次)
// 2. cond → false 跳出
// 3. body
// 4. step
// 5. 跳轉 2
A && B // A 為假 → B 不執行,整體為假
A || B // A 為真 → B 不執行,整體為真
// 利用特性:if (p && p->func()) 安全調用
printf("%d %d\n", a++, ++a); // 未定義行為!輸出不可預測
// 實際由調用約定、編譯器優化決定,嚴禁依賴
int arr[10];
sizeof(arr) // 40 (整個數組大小,不退化)
strlen(arr) // 錯誤:arr 退化為 int*,非字符串
// 正確:字符串字面量
char str[] = "hello";
sizeof(str) // 6 (含 \0)
strlen(str) // 5
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a + 1); // &a 是 int(*)[5],+1 跳過整個數組
// ptr 指向 a[5] (越界位置)
printf("%d %d", *(a+1), *(ptr-1)); // 2, 5
// 關鍵:&a + 1 ≡ &a[5],ptr-1 ≡ &a[4]
char *p = malloc(100);
sizeof(p) // 4/8 (指針大小)
sizeof(*p) // 1 (char 大小)
strlen(p) // 未初始化 UB,賦值後為字符串長度
| 方法 | capacity | size | 元素構造 | 訪問方式 |
|---|---|---|---|---|
| reserve(n) | ≥ n | 不變 | 無 | push_back/insert |
| resize(n) | ≥ n | = n | 有 (默認構造) | operator[] / iterator |
class A {
int x;
void Func() const { x = 10; } // 編譯錯誤:const 承諾不修改成員
mutable int cache; // 例外:mutable 允許 const 函數修改
};
struct S { int i; int *p; } s;
int *p = &s.i;
s.p = p; // s.p 指向 s.i
s.p[1] = 1; // 相當於 *(s.p+1) = 1,即修改 s.p 指針自身的值!
// s.p 變為 0x1 (非法地址)
s.p[0] = 2; // 嘗試寫入 0x1 → 崩潰
核心:s.p[1] 訪問的是 s.p 後面的內存,恰好是 s.p 自身的存儲位置(結構體成員連續)。整數 1 被強制解釋為指針地址 0x1。
new 調用構造函數,delete 調用析構函數malloc 僅分配原始內存,free 僅釋放new 配 delete,new[] 配 delete[],malloc 配 freechar c = digit + '0'; (ASCII 碼連續)string 對象大小固定 (通常 24/32 字節,含指針/長度/容量/小字符串優化緩衝),動態內存分配在堆上,sizeof(string) 不等於字符串長度。malloc/new → 堆 (手動管理,大小受限於虛擬內存)更多陷阱:虛函數表指釖、多重繼承指針調整、模板代碼膨脹、異常安全、ABA 問題、內存序、鎖自由編程...