char *a[] —— 陣列每個元素是 char*,儲存字串首地址。char **b —— 儲存「指標陣列首地址」的變數,雙重間接訪問字串。a 是陣列名(常量地址),b 是指標變數(可修改指向)。char *a[] = { "abc", "cde", "fgh" }; // 靜態區存字串,棧上存三個指標
char **b = a; // b 指向陣列首元素(即 "abc" 的地址)
cout << *b << "|" << *(b+1) << "|" << *(b+2) << endl;
// 輸出:abc|cde|fgh
棧區 (a[]): [0x1000] → 0x5000 ("abc")
[0x1004] → 0x5004 ("cde")
[0x1008] → 0x5008 ("fgh")
靜態區: 0x5000: 'a''b''c''\0'
0x5004: 'c''d''e''\0'
0x5008: 'f''g''h''\0'
b = 0x1000 (a 的首地址)
*b = 0x5000 → "abc"
*(b+1) = 0x5004 → "cde" // 32位系統指標 4 bytes,+1 即 +4 bytes
*(b+2) = 0x5008 → "fgh"

cout << char* 會從該地址持續輸出直到遇到 \0,這是 C++ 流對 C 風格字串的約定行為。
void print_char(char *array[], int len) {
for (int i = 0; i < len; ++i)
cout << *array++ << endl; // array 是指標變數,可遞增
}
void main() {
char *test[] = { "abc", "cde", "fgh" };
int num = sizeof(test) / sizeof(char*); // 3
print_char(test, num);
}
test 退化為 char**(首元素地址)傳入。char *array[] 與 char **array 等價,均為指標變數,存儲於棧區,可作為左值修改(如 array++)。array++ 移動 sizeof(char*) bytes,逐一取得字串首址並解引用輸出。| 錯誤寫法 | 正確寫法 | 原因 |
|---|---|---|
char *b = a; | char **b = a; | 類型不匹配:a 是 char*[3],退化為 char** |
char a[] = {"abc","cde"} | char *a[] = {"abc","cde"} | char a[] 是單一字元陣列,無法存多個字串首址 |
以為 *(b+1) 輸出 'c' | 理解為輸出 "cde" | b+1 移動一個指標槽位,非字元位移 |
argvint main(int argc, char *argv[]) 中的 argv 正是字元指標陣列,argv[0] 為程式路徑,argv[1] 起為使用者參數。掌握本文概念,處理命令列解析將得心應手。
char *a[] 定義指標陣列,元素型別 char*,存字串首址。char **b = a 讓雙重指標指向陣列首元素,支援 *(b+i) 遍歷。+1 即位移 4 bytes。char ** 或 char *[]。