首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

一個 for 循環遍歷二維數組:行主序內存佈局的巧妙應用

     編輯:C++ 入門

核心原理:行主序與索引映射

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 合併為單層,減少循環開銷與縮進層級。
  • 緩存友好:線性訪問符合 CPU 預取機制,對大數組性能更優。
  • 通用算法適配:便於使用 std::sort、std::transform 等單迭代器算法處理多維數據。

注意事項

  1. 僅適用於靜態/棧上分配的真正多維數組(連續內存)。
  2. 動態分配的 int**(指針數組)或 vector<vector<int>> 內存不連續,不可用此法。
  3. 列數 COLS 必須為編譯期常量或運行期已知值。

總結

理解行主序佈局與索引映射,不僅能寫出更優雅的遍歷代碼,更是掌握 C/C++ 內存模型、優化數組訪問性能的基礎功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved