二维动态数组COLS与ROWS命名正确性及索引含义问询
二维动态数组的命名与索引疑问
以下代码创建了一个二维动态数组:
#include <iostream> #define COLS 3 #define ROWS 3 int ** create2d() { int index = 1; int** arr = new int*[COLS]; for (size_t i = 0; i < COLS ; i++) { arr[i] = new int[ROWS]; for (size_t j = 0; j < ROWS ; j++) { arr[i][j] = index++; printf("%d (%d) [%d][%d]\t", arr[i][j], &arr[i][j], i,j); } printf("\n"); } return arr; } int main() { int** arr = create2d(); for (int i = 0; i < COLS; i++) { delete[] arr[i]; } delete[] arr; return 0; }
输出结果
./main 1 (34979536) [0][0] 2 (34979540) [0][1] 3 (34979544) [0][2] 4 (34980608) [1][0] 5 (34980612) [1][1] 6 (34980616) [1][2] 7 (34980640) [2][0] 8 (34980644) [2][1] 9 (34980648) [2][2]
从输出结果可见,数组元素的增量与元素地址的增量相匹配。
问题
- 代码中的
COLS和ROWS命名是否正确? - 若命名正确,是否意味着在
arr[p][q]中,左侧索引p始终可视为列,右侧索引q始终可视为行?
解答
命名不正确。从代码实现逻辑来看:
new int*[COLS]创建了包含COLS个指针的数组,每个指针对应一行元素;- 每个指针指向的数组大小为
ROWS,即每行包含ROWS个列元素。
这说明实际逻辑里COLS代表行数,ROWS代表列数,和变量名的字面含义完全相反,属于命名错误。
即使命名正确,也不能得出“左侧索引
p始终是列,右侧q始终是行”的结论。二维数组的索引含义完全由代码的定义逻辑和业务场景决定:- 行业惯例中通常采用
arr[行号][列号]的顺序,但这只是约定俗成的写法,C++语法并没有强制规定索引的含义; - 开发者完全可以根据需求定义
arr[列][行]的结构,只要代码逻辑自洽即可。
- 行业惯例中通常采用
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

