C 語言面試常考察對記憶體模型、指針本質、運算符優先級及短路求值的理解。本文精選三道高頻題目,逐行拆解輸出結果與底層原理,助你避開常見陷阱。
[cpp]
int main() {
char str1[] = "hello world";
char str2[] = "hello world";
char *str3 = "hello world";
char *str4 = "hello world";
if (str1 == str2) printf("str1 and str2 are same.\n");
else printf("str1 and str2 are not same.\n");
if (str3 == str4) printf("str3 and str4 are same.\n");
else printf("str3 and str4 are not same.\n");
return 0;
}
str1 and str2 are not same.
str3 and str4 are same.
str1 == str2 為假。str3 == str4 為真。核心結論:數組名代表首元素地址,每次定義即分配新空間;指針指向字面量時共享唯一拷貝。
[cpp]
int Fun1(char* str) { printf("%s\n", str); return 0; }
int Fun2(char* str) { printf("%s\n", str); return 1; }
int main() {
int res1, res2;
res1 = (Fun1("a") && Fun2("b")) || (Fun1("c") || Fun2("d"));
res2 = (Fun1("a") && Fun2("b")) && (Fun1("c") || Fun2("d"));
return res1 || res2;
}
a
c
d
a
Fun1("a") 返回 0(假)→ 短路,Fun2("b") 不執行。Fun1("c") || Fun2("d")。Fun1("c") 返回 0 → 需算 Fun2("d"),返回 1 → 右邊為真。a、c、d。Fun1("a") 返回 0 → 短路,Fun2("b") 不執行。&& 整體必假 → 右邊 完全不執行。a。關鍵知識點:C/C++ 邏輯運算左到右順序計算,且具備短路特性(&& 遇假停、|| 遇真停)。
[cpp]
int SizeOf(char pString[]) { return sizeof(pString); }
int main() {
char *pString1 = "google";
int size1 = sizeof(pString1); // 指針大小
int size2 = sizeof(*pString1); // 指向類型大小
char pString2[100] = "google";
int size3 = sizeof(pString2); // 整個數組大小
int size4 = SizeOf(pString2); // 傳入函數退化為指針
printf("%d, %d, %d, %d", size1, size2, size3, size4);
return 0;
}
4, 1, 100, 4
| 表達式 | 結果 | 原因 |
|---|---|---|
sizeof(pString1) | 4 | 指針變量本身,32位系統佔 4 字節 |
sizeof(*pString1) | 1 | 解引用得到 char,佔 1 字節 |
sizeof(pString2) | 100 | 數組在定義處保留完整類型信息,含 100 個 char |
SizeOf(pString2) | 4 | 數組作函數參數退化為指針,sizeof 測得指針大小 |
避坑指南:在函數內無法通過 sizeof 獲取傳入數組的長度,必須額外傳遞長度參數或使用哨兵值(如字符串的 \0)。