指針數組聲明形式:類型 *數組名[長度]。例如 int *pa[3] 表示含 3 個指向整型指針的數組。常用於指向二維數組:各元素存儲二維數組每行首地址,可視為指向一維數組。
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];
對二維數組 a 與指針數組 pa:
*a[i] → 第 i 行第 0 列*(*(a+i)+i) → 第 i 行第 i 列*pa[i] → 第 i 行第 0 列p[i] / *(p+i) → 第 0 行第 i 列(因 p=a[0])| 特性 | 指針數組 | 二維數組指針 |
|---|---|---|
| 本質 | 多個指針的集合 | 單個指針變量 |
| 聲明形式 | int *p[3] | int (*p)[3](括號不可省) |
| 含義 | 3 個指針變量:p[0]、p[1]、p[2] | 指向列數為 3 的二維數組 |
初始化極簡:
char *name[] = {
"Illegal day",
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
name[0] 指向 "Illegal day",name[1] 指向 "Monday"……
傳統排序需交換字符串內容,開銷大。指針數組僅交換指針值(地址),大幅提升效率。
#include <string.h>
void sort(char *name[], int n) {
char *pt;
int i, j, k;
for (i = 0; i < n-1; i++) {
k = i;
for (j = i+1; j < n; j++)
if (strcmp(name[k], name[j]) > 0) k = j;
if (k != i) {
pt = name[i];
name[i] = name[k];
name[k] = pt;
}
}
}
void print(char *name[], int n) {
for (int i = 0; i < n; i++) printf("%s\n", name[i]);
}
int main() {
char *name[] = {"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
int n = 5;
sort(name, n);
print(name, n);
return 0;
}
strcmp 直接接受指針參數比較字符串;交換時僅移動指針,避免內存複製,顯著降低時間開銷。
指針數組是處理字符串集合、二維數組行訪問、函數參數傳遞的利器。理解其與二維數組指針的區別,善用指針交換替代數據移動,能編寫出高效、優雅的C代碼。