char *name[] = {"File","Edit","Write","Read","Exit"};
char **p = name;
for (int i=0; i<5; i++) {
printf("%s\t", **p); // 錯誤:傳遞 char 給 %s
p++;
}
運行無輸出或亂碼;改為 `printf("%s\t", *p);` 即正常。
name (char *[5]) → [0] → "File\0"
[1] → "Edit\0"
...
p (char **) → 指向 name[0] 地址
*p → char * → 指向 "File\0" 首字符地址 ← %s 期望的類型
**p → char → 'F' ← %c 期望的類型
// 寫法 1:指針算術
for (char **p = name; p < name + 5; p++)
printf("%s ", *p);
// 寫法 2:下標
for (int i = 0; i < 5; i++)
printf("%s ", name[i]);
// 寫法 3:範圍 for (C++)
for (const char *s : name) cout << s << ' ';
編譯器啟用 `-Wformat`(GCC/Clang)或 `/W4`(MSVC)會報警:`format '%s' expects argument of type 'char *', but argument 2 has type 'int'`。善用編譯器警告,比運行時調試更高效。