C语言多维数组存储顺序:行/列优先?是否依赖编译器?
C语言多维数组的存储顺序:行优先还是列优先?
咱们先把核心结论说清楚:在C语言标准中,多维数组的元素存储顺序是明确规定为行优先顺序(row major order)的,这并不是由编译器决定的——所有符合C标准的编译器都必须遵循这个规则。
什么是行优先顺序?
简单来说,就是先把一行的所有元素全部存储完毕,再开始存储下一行的元素。拿二维数组举例:对于arr[row][col],内存中的存储顺序是:arr[0][0] → arr[0][1] → ... → arr[0][col-1] → arr[1][0] → arr[1][1] → ... → arr[row-1][col-1]
结合你的示例代码分析
看你给出的两段初始化代码:
int arr[2][3]={1,2,3,4,5,6}; int array[3][2]={1,2,3,4,5,6};
- 对于
arr[2][3],按照行优先,第一行是1、2、3,第二行是4、5、6,所以内存里的元素顺序就是1,2,3,4,5,6; - 对于
array[3][2],同样遵循行优先,第一行是1、2,第二行是3、4,第三行是5、6,内存里的元素顺序依然是1,2,3,4,5,6。
这就是为什么你打印两个数组的内存顺序时,输出结果完全一致的原因——它们都严格按照C标准要求的行优先顺序在内存中排列。
顺便提一句,像Fortran这类语言采用的是列优先顺序,但C语言从设计之初就明确了行优先的规则,不存在编译器自由选择的空间。
内容的提问来源于stack exchange,提问作者sagar singh
相关产品推荐
相关产品推荐

