類型 *數組名[長度];
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *pa[3] = {a[0], a[1], a[2]}; // 每個元素指向一行
int *p = a[0]; // 單指針指向首行
// 訪問
pa[i][j] // 等價 *(pa[i]+j) 等價 a[i][j]
p[i] // 僅能訪問第 0 行
| 項目 | 指針數組 int *pa[3] | 二維數組指針 int (*p)[3] |
|---|---|---|
| 本質 | 多個獨立指針 (3 個 int*) | 單一指針,指向整個二維數組 |
| 聲明括號 | *pa[3] 無括號 | (*p)[3] 必須括號 |
| 行長度信息 | 無(每行可不同長) | 有(編譯器知列數) |
| 內存佈局 | 指針數組連續,數據可不連續 | 數據整體連續 |
| 動態分配 | 易於逐行 malloc | 需一次性分配或模擬 |
char *names[] = {
"Illegal", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
// names[0] -> "Illegal", names[1] -> "Monday" ...
交換指針而非字符串內容,O(1) 交換開銷。
#include
#include
void sort(char *name[], int n) {
for (int i = 0; i < n-1; ++i) {
int k = i;
for (int j = i+1; j < n; ++j)
if (strcmp(name[k], name[j]) > 0) k = j;
if (k != i) {
char *tmp = name[i];
name[i] = name[k];
name[k] = tmp;
}
}
}
void print(char *name[], int n) {
for (int i = 0; i < n; ++i) puts(name[i]);
}
int main() {
char *countries[] = {"CHINA", "AMERICA", "AUSTRALIA", "FRANCE", "GERMAN"};
int n = 5;
sort(countries, n);
print(countries, n);
return 0;
}
strcmp 接受 const char*,指針數組元素類型匹配。name[i] 與 name[k] 僅搬運指針值(4/8 字節),不動字符數據。char name[5][20],交換需 strcpy 逐字符拷貝,慢且受限於固定列寬。
char *day_name(char *name[], int n) {
char *pp1 = name[0];
char *pp2 = name[n];
return (n<1 || n>7) ? pp1 : pp2;
}
int main() {
char *names[] = {"Illegal","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
int d; scanf("%d", &d);
printf("Day %d -> %s\n", d, day_name(names, d));
return 0;
}
char *name[] 等價 char **name,接收指針數組首地址。name[i] 或 *(name+i) 訪問。類型 *名[長度],無括號。類型 (*名)[列數] 有括號,攜帶列數信息,數據連續。類型**,內部按指針數組訪問。malloc 靈活釋放;二維數組指針需單塊分配或模擬。