本文匯總了大量經典 C/C++ 面試題,涵蓋指針與內存、數據結構與算法、操作系統原理、網絡協議、併發編程等核心領域,並提供詳細解析,是備戰技術面試的寶貴資料庫。
// 錯誤:string[10] 存放 "0123456789" 缺少結束符空間 char string[10]; char *str1 = "0123456789"; strcpy(string, str1); // 溢出 // 正確:至少分配 11 字節 char string[11];
核心點:C 字符串以 '\0' 結尾,strcpy 會複製結束符,目標緩衝區必須足夠大。
// 錯誤:I 未定義,且循環條件應為 I < 9 留位給 '\0' for (I = 0; I < 10; I++) str1[I] = 'a'; str1[I] = '\0'; // 缺少結束符賦值 // 正確 int I; for (I = 0; I < 9; I++) str1[I] = 'a'; str1[I] = '\0';
// 錯誤:strlen <= 10 允許長度 10 的字符串,複製時會溢出 if (strlen(str1) <= 10) strcpy(string, str1); // 正確:嚴格小於目標緩衝區大小 if (strlen(str1) < 10) strcpy(string, str1);
const:聲明只讀變量,編譯器優化時不會修改,可置於只讀存儲區。volatile:告訴編譯器該變量可能被外部(硬件、中斷、其他線程)意外修改,禁止優化缓存,每次必須從內存讀取。| 特性 | 指針 | 引用 |
|---|---|---|
| 初始化 | 可延遲 | 必須在聲明時初始化 |
| 重新綁定 | 可指向其他對象 | 綁定後不可改變 |
| 空值 | 可為 NULL | 不存在空引用 |
| sizeof | 指針大小 (4/8 字節) | 引用對象大小 |
| 多級間接 | 支持 (int **) | 不支持 |
左右子樹均為平衡二叉樹,且左右子樹高度差絕對值 ≤ 1。
O(n²)
#define EPS 1e-6
if (x > -EPS && x < EPS) { /* 視為零 */ }
快指針步長 2,慢指針步長 1,相遇後慢指針回頭,雙指針步長 1 再次相遇即為環入口。
FCFS(先來先服務)、優先級調度、時間片輪轉、多級反饋隊列。
應用層、傳輸層、網絡層、網絡接口層(數據鏈路+物理)。
| 特性 | TCP | UDP |
|---|---|---|
| 連接性 | 面向連接 | 無連接 |
| 可靠性 | 可靠、有序、流控 | 不可靠、無序、無流控 |
| 開銷 | 頭部 20+ 字節 | 頭部 8 字節 |
| 適用場景 | 文件傳輸、Web、郵件 | 視頻流、DNS、即時遊戲 |
將 IP 地址解析為 MAC 地址(物理地址)。
a = a + b; b = a - b; a = a - b; // 或 a ^= b; b ^= a; a ^= b; // 僅限整數類型
bool isPowerOfTwo(int x) { return x > 0 && (x & (x - 1)) == 0; }
入隊 push 入棧 A;出隊時若棧 B 為空,將 A 全部 pop 並 push 入 B,再 pop B。攤還 O(1)。
#define SWAP(x, y) do { typeof(x) _tmp = (x); (x) = (y); (y) = _tmp; } while(0)
int findDup(int a[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
return sum - n*(n-1)/2;
}
x & (x-1):清除最低位的 1(用於統計 1 的個數)。x & (-x):取最低位的 1。x | (x-1):將最低位的 0 置為 1。:: (C++) 或避免同名。extern 引用全局變量,編譯期不報錯,鏈接期解析。static 或僅聲明 extern,定義放在 .c 文件。SetWindowsHookEx(WH_KEYBOARD, ...) 攔截並修改按鍵。C/C++ 面試考察廣度極大,既要掌握語言底層機制(指針、內存、編譯鏈接),又要熟悉核心數據結構算法、操作系統原理、網絡協議與併發編程。建議以「原理為本,代碼驗證」為學習策略,多動手寫代碼、追蹤汇編、分析內存佈局,方能在面試中游刃有余。