首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C/C++ 指標經典面試題深度解析:15 道必會真題

     編輯:關於C

核心口訣:const 與 * 相對位置

  • char * const p:指標本身不可改(常量指標)
  • char const * p / const char * p:指向內容不可改(指向常量的指標)
  • const char * const p:雙重不可改
  • 記憶法:以 * 為界,左邊 const 修飾內容,右邊 const 修飾指標

題目 1:陣列 vs 指標字串比較

char str1[] = "abc";  // 栈上各自分配,地址不同
char str2[] = "abc";
const char *p1 = "abc"; // 指向唯讀區同一字面常數
const char *p2 = "abc";

printf("%d %d %d %d", str1==str2, p1==p2, str1==p1, str2==p2);
// 輸出:0 0 0 0(若編譯器合併字面常數 p1==p2 可能為 1)

關鍵:[] 每次分配新空間;* 指向字面常數區,編譯器可合併相同常數。

題目 2:函數參數陣列 sizeof 失效

void Upper(char str[]) {
    for (size_t i=0; i

陣列作參數退化為指標,失去長度資訊。解法:額外傳長度或結構體封裝。

題目 3:&a + 1 陷阱

int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a + 1);
printf("%d %d", *(a+1), *(ptr-1));
// a+1 → &a[1] → 2
// &a+1 → 跨越整個陣列 → &a[5] → ptr-1 → &a[4] → 5
// 輸出:2 5

&a 型態為 int(*)[5],+1 跳過 5 個 int。

題目 4:指標未分配空間 strcpy 崩潰

char c; char *p = &c; strcpy(p, "hello"); // 僅 1 byte,寫入 6 byte → 越界崩潰

必須 malloc 或用足夠大陣列。

題目 5:字面常數區不可修改

char *s = "AAA"; s[0] = 'B'; // 未定義行為,通常崩潰
// 正確:char s[] = "AAA"; 或 malloc + strcpy

題目 6:函數指標陣列宣告

int (*pf[10])(int); // 10 個指標,每個指向 int func(int)

題目 7:函數內 malloc 無法回傳

void GetMem(char *p) { p = malloc(100); } // p 為副本,外部不變
// 正確:void GetMem(char **p) { *p = malloc(100); } 呼叫 GetMem(&str);

題目 8:未初始化陣列 strlen 亂碼

char a[10]; printf("%zu", strlen(a)); // 未以\0結尾,讀到隨機\0 → 亂數
// sizeof 不受影響,strlen 依賴\0

題目 9:括號改變宣告含義

char (*p)[20]; // 陣列指標
char *p[20];   // 指標陣列

題目 10:位元欄 memcpy 複製

struct { int b1:5; int b2:2; } s;
char buf[] = "0123456789...";
memcpy(&s, buf, sizeof(s));
// buf 前 4 byte ASCII: 0x30 0x31 0x32 0x33
// b1 取低 5 bits: 0x30 & 0x1F = 0x10 = 16 → 有號視為 -16
// b2 取次 2 bits: (0x30>>5)|(0x31<<3) ... = 1
// 輸出:-16 1

題目 11:絕對地址跳轉

void (*fp)() = (void(*)())0x100000;
fp(); // 或 *((void(*)())0x100000)();

題目 12:free 後指標非 NULL,二次複製風險

free(p); // p 值不變,指向已釋放記憶體
if (p) strcpy(p, "danger"); // 未定義行為,記憶體可能已重新分配
// 習慣:free(p); p = NULL;

題目 13:靜態區域變數特性

  • 儲存於靜態區,程式全期存在
  • 作用域仍限於區塊
  • 未顯式初始化自動為 0

題目 14:extern 跨檔案共享

extern int g; 告訴編譯器 g 在別處定義,連結時解析。

題目 15:指標組合宣告讀法

int *(*(*a)())[10];
// a → 函數指標 → 回傳 → 陣列指標[10] → 元素 → 指標 → int

備戰建議

  1. 熟練畫記憶體圖(棧/堆/資料段/代碼段)
  2. 手寫 malloc/free、strcpy、鏈表反轉
  3. 理解 const、volatile、restrict 語義
  4. 練習組合宣告「由內而外」讀法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved