C/C++ 中二維數組在內存中按行主序連續存儲。以 int arr[2][3] = {{1,2,3},{4,5,6}} 為例,內存實際佈局為:1,2,3,4,5,6。若將 6 個元素按一維線性編號 0~5,則任意線性索引 i 對應的行列計算公式為:
row = i / COLS(整除)col = i % COLS(取模)其中 COLS 為列數(第二維大小)。此原理可推廣至任意維度數組。
#include <cstdio>
#define ROWS 2
#define COLS 3
void printArray() {
int array[ROWS][COLS] = { 1, 2, 3, 4, 5, 6 };
for (int i = 0; i < ROWS * COLS; ++i) {
int row = i / COLS;
int col = i % COLS;
printf("行號為 %d, 列號為 %d\n", row, col);
printf("%d\n", array[row][col]);
}
}
int main() {
printArray();
getchar();
return 0;
}
行號為 0, 列號為 0 1 行號為 0, 列號為 1 2 行號為 0, 列號為 2 3 行號為 1, 列號為 0 4 行號為 1, 列號為 1 5 行號為 1, 列號為 2 6
for 合併為單層,減少循環開銷與縮進層級。std::sort、std::transform 等單迭代器算法處理多維數據。int**(指針數組)或 vector<vector<int>> 內存不連續,不可用此法。COLS 必須為編譯期常量或運行期已知值。理解行主序佈局與索引映射,不僅能寫出更優雅的遍歷代碼,更是掌握 C/C++ 內存模型、優化數組訪問性能的基礎功力。