C语言中多维数组的存储顺序

C语言中多维数组的存储顺序,c,arrays,multidimensional-array,memory-layout,C,Arrays,Multidimensional Array,Memory Layout,对于C编译器,数组元素是按列主顺序还是按行主顺序存储,还是依赖于编译器 int arr[2][3]={1,2,3,4,5,6}; int array[3][2]={1,2,3,4,5,6}; 打印arr和阵列输出时: arr: 数组: 1 2 3 4 5 6 似乎它总是更喜欢行主顺序?行主顺序是标准规定的 : 连续的下标运算符指定 多维数组对象。如果E是n维数组(n>=2) 用尺寸i x j x。x k,然后是E(用作 左值)转换为指向(n-1)维数组的指针,该数组具有 尺寸j x。xk。如

对于C编译器,数组元素是按列主顺序还是按行主顺序存储,还是依赖于编译器

int arr[2][3]={1,2,3,4,5,6};
int array[3][2]={1,2,3,4,5,6};
打印arr和阵列输出时: arr:

数组:

1 2
3 4
5 6

似乎它总是更喜欢行主顺序?

行主顺序是标准规定的

:

连续的下标运算符指定 多维数组对象。如果E是n维数组(n>=2) 用尺寸i x j x。x k,然后是E(用作 左值)转换为指向(n-1)维数组的指针,该数组具有 尺寸j x。xk。如果一元*运算符应用于此 作为订阅的结果,指针显式地或隐式地 结果是引用的(n-1)维数组,它本身是 如果用作左值以外的值,则转换为指针。接下来 由此可知,数组按行主顺序(最后一个下标)存储 变化最快)

(我的重点)

您打印了阵列。输出以您打印数组元素的任何顺序进行。因此,您看到的与数组元素在内存中的存储顺序无关


int arr[2][3]表示有三个数组,每个数组中存储的对象是int[2]。对象总是连续存储的,因此第一个int[2]存储在连续内存中,第二个int[2]后跟第三个int[2]。这对于任何C实现都是一样的

我还有一个问题-为什么双指针(**ptr)不能用于访问数组?因为没有存储指针。请把“双指针”从你的脑海中抹去。有指向指针的指针,但这不是“双指针”。我支持gnasher729。多维数组≠ 乘法间接指针。虽然您可以像
二维数组[1][0]
一样执行
双重间接[1][0]
(如果双重间接是一个包含至少两个指针的指针数组),但
[1][0]
在这两种上下文中的含义非常不同,但这可能是另一个问题的主题。你没有太注意
-Wmissing brates
警告,是吗?我正在读一本书,书中给出了------->与其他变量一样,声明二维数组只为内存中的数组保留空间。其中不存储任何值。二维数组的初始化方式与一维数组的初始化方式相同。例如,int标记[2][3]={90,87,78,68,62,71};请注意,二维数组的初始化是逐行完成的。上述语句也可以写成:int标记[2][3]={90,87,78},{68,62,71};在gcc/clang上,至少应该使用
-Wall-Wextra
(也应该使用
-pedantic
),在VS(
cl.exe
)上应该使用
/W3
)。如果您这样做,您将收到警告。
arr
的声明应该有
int-arr[2][3]={{1,2,3},{4,5,6}在未发出警告的情况下编译代码之前,不要接受代码。
1 2
3 4
5 6