字符二維數組 char a[][7] = {"foo", "bar", "foobar"};,想交換第 0 行和第 2 行的內容。
二維數組名 a 是數組指針常量(類型 char (*)[7]),不能修改指向,即無法執行 a[0] = a[2] 這類指針賦值操作。
void swapRows(char a[][7], int row1, int row2, int cols) {
for (int i = 0; i < cols; i++) {
char temp = a[row1][i];
a[row1][i] = a[row2][i];
a[row2][i] = temp;
}
}
int main() {
char a[][7] = {"foo", "bar", "foobar"};
swapRows(a, 0, 2, 7);
// 現在 a[0]="foobar", a[2]="foo"
return 0;
}
內存連續佈局(行優先):
a[0]: f o o \0 x x x ← 7 bytes
a[1]: b a r \0 x x x ← 7 bytes
a[2]: f o o b a r \0 ← 7 bytes
地址遞增 →
a[i] 相當於 *(a + i),偏移 i * 7 字節char* a[] 那樣交換行指針char* ptrArray[] = {"foo", "bar", "foobar"}; // 指針數組
// 可以直接交換指針
char* temp = ptrArray[0];
ptrArray[0] = ptrArray[2];
ptrArray[2] = temp; // O(1) 時間複雜度
| 類型 | 聲明 | 行交換方式 | 時間複雜度 |
|---|---|---|---|
| 二維數組 | char a[][7] | 逐字符交換內容 | O(cols) |
| 指針數組 | char* a[] | 交換指針值 | O(1) |
根據數據結構選擇合適的交換策略,二維數組只能「搬運數據」,指針數組可以「搬運指針」。