語法:型態 *陣列名[長度];
解析順序:[ ] 優先級高於 * → 先形成陣列,再每元素為指標。
本質:陣列元素皆為指標,各自指向對應型態資料。
char *str[4]; // 4 個 char* 指標:str[0]~str[3]
int *ptr[5]; // 5 個 int* 指標:ptr[0]~ptr[4]
char *ptr1[4] = {"china", "chengdu", "sichuan", "chongqing"};
// ptr1[0]→"china", ptr1[1]→"chengdu"...
for (i = 0; i < 4; i++) printf("\n%s", ptr1[i]);
字串常數區唯讀,指標指向常數區,不可修改內容。
int a[3] = {1, 2, 3};
int *ptr2[3];
for (i = 0; i < 3; i++) ptr2[i] = &a[i]; // 取元素位址
for (i = 0; i < 3; i++) printf("%4d", *ptr2[i]); // 輸出 1 2 3
int b[3][2] = {{1,2}, {3,4}, {5,6}};
for (i = 0; i < 3; i++) ptr2[i] = b[i]; // b[i] 為第 i 列首位址
for (i = 0; i < 3; i++)
printf("%4d%4d\n", *ptr2[i], *(ptr2[i]+1)); // 列印第 i 列兩元素
關係:ptr2[i] 指向 b[i][0],ptr2[i]+1 指向 b[i][1]。
二維字元陣列 char str[5][20] 可視為 5 個字串。指標陣列提供靈活操作:排序時交換指標而非複製字串內容,效率高。
#include
#include
#include
main() {
char *ptr1[4], str[4][20], temp[20];
int i, j;
for (i = 0; i < 4; i++) gets(str[i]); // 輸入 4 字串
for (i = 0; i < 4; i++) ptr1[i] = str[i]; // 指標指向各列首址
printf("original string:\n");
for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);
// 冒泡排序:交換指標
for (i = 0; i < 3; i++)
for (j = 0; j < 3 - i; j++)
if (strcmp(ptr1[j], ptr1[j+1]) > 0) {
strcpy(temp, ptr1[j]);
strcpy(ptr1[j], ptr1[j+1]);
strcpy(ptr1[j+1], temp);
}
printf("sorted string:\n");
for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);
}
注意:此版本實際複製字串內容(strcpy),指標陣列優勢未完全發揮。真正優勢見範例 2。
指標陣列定義後,元素指向不確定(野指標)。
char *ptr[3];→ 三個指標指向隨機位址。
scanf("%s", ptr[i])將寫入隨機記憶體 → 崩潰/安全漏洞。
必須先指派安全位址:指向現有陣列、malloc 分配區、字串常數區。
#include
#include
#include
main() {
char *ptr1[4], *temp;
int i, j;
for (i = 0; i < 4; i++) {
ptr1[i] = malloc(20); // 為每指標分配 20 bytes
gets(ptr1[i]); // 直接讀入分配區
}
printf("original string:\n");
for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);
// 冒泡排序:僅交換指標值(極快)
for (i = 0; i < 3; i++)
for (j = 0; j < 3 - i; j++)
if (strcmp(ptr1[j], ptr1[j+1]) > 0) {
temp = ptr1[j]; // 指標交換
ptr1[j] = ptr1[j+1];
ptr1[j+1] = temp;
}
printf("sorted string:\n");
for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);
// 釋放記憶體(良好習慣)
for (i = 0; i < 4; i++) free(ptr1[i]);
}
優勢對比:
| 方式 | 排序時操作 | 時間複雜度 | 記憶體管理 |
|---|---|---|---|
| 靜態陣列 + strcpy | 複製字串內容 | O(n² × 字串長度) | 自動(棧上) |
| malloc + 指標交換 | 交換指標值 (4/8 bytes) | O(n²) | 手動 malloc/free |
// 靜態版:ptr1 指向 str 陣列各列
ptr1[0] → str[0] → [c][h][i][n][a][\0]
ptr1[1] → str[1] → [c][h][e][n][g][d][u][\0]
...
// 動態版:ptr1 指向 heap 區塊
ptr1[0] → malloc(20) → [c][h][i][n][a][\0][?][?]...
ptr1[1] → malloc(20) → [c][h][e][n][g][d][u][\0]...
...
main(int argc, char *argv[]) // argv 為 char* 陣列
系統啟動時建立,指向命令列各參數字串。
型態 *名[長度],每元素為指標malloc 分配 + 指標交換(不動字串內容)free 釋放argv、環境變數 envp 皆為系統建構的指標陣列