int ia[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}
};
int (*p)[4]; // 指向含 4 個 int 的陣列指標
for (p = ia; p != ia + 3; ++p) // 遍歷列
for (int *q = *p; q != *p + 4; ++q) // 遍歷行
std::cout << *q << std::endl;
關鍵點:
ia 退化為 int (*)[4],指向第一列。*p 取得當前列的首元素地址(int*)。for (size_t i = 0; i != 3; ++i)
for (size_t j = 0; j != 4; ++j)
std::cout << ia[i][j] << std::endl;
現代 C++ 改良:範圍 for (C++11) 更簡潔安全:
for (auto& row : ia)
for (auto& elem : row)
std::cout << elem << std::endl;
| 維度 | 指標法 | 下標法 | 範圍 for |
|---|---|---|---|
| 執行速度 | 最快(無邊界檢查) | 次之 | 同下標法 |
| 程式碼清晰度 | 較低 | 高 | 最高 |
| 維護風險 | 高(手動管理邊界) | 中 | 低(編譯器推導邊界) |
| 適用場景 | 效能關鍵路徑、C 風格介面 | 一般業務邏輯 | 現代 C++ 專案首選 |
// 連續記憶體塊 + 指標陣列
int** arr = new int*[rows];
arr[0] = new int[rows * cols];
for (int i = 1; i < rows; ++i) arr[i] = arr[i-1] + cols;
// 此時指標法需調整:
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
std::cout << arr[i][j]; // 下標法通用性最強