目录
在 C 语言中,二维数组是按 行主序(row-major order) 存储的。也就是说,数组的每一行按顺序存储在内存中,所有行按顺序依次存放在内存的连续区域。
1. 二维数组的定义:
假设有一个二维数组 axisData
,它的定义如下:
float axisData[3][4];
这个数组有 3 行 4 列,总共有 12 个元素。二维数组 axisData
在内存中的存储方式如下:
2. 行主序存储:
数组中的数据在内存中的存储顺序是按行存储的。也就是说,首先存储的是第一行的所有元素,然后是第二行,接着是第三行,依此类推。
对于数组 axisData[3][4]
,它在内存中的布局如下:
axisData[0][0], axisData[0][1], axisData[0][2], axisData[0][3],
axisData[1][0], axisData[1][1], axisData[1][2], axisData[1][3],
axisData[2][0], axisData[2][1], axisData[2][2], axisData[2][3]
具体内存排列:
假设 axisData
在内存中的起始地址为 0x1000
,那么它的内存布局将是:
内存地址 | 数据 |
---|---|
0x1000 | axisData[0][0] |
0x1004 | axisData[0][1] |
0x1008 | axisData[0][2] |
0x100C | axisData[0][3] |
0x1010 | axisData[1][0] |
0x1014 | axisData[1][1] |
0x1018 | axisData[1][2] |
0x101C | axisData[1][3] |
0x1020 | axisData[2][0] |
0x1024 | axisData[2][1] |
0x1028 | axisData[2][2] |
0x102C | axisData[2][3] |
在这个例子中,数据 axisData[0][0]
在 0x1000
地址上,axisData[0][1]
紧接着存储在 0x1004
地址上,依此类推,直到 axisData[2][3]
存储在 0x102C
地址上。
3. 如何通过指针访问数据:
由于二维数组是按行主序存储的,因此我们可以通过指针偏移的方式访问数组元素。比如,给定 axisData[3][4]
数组的起始地址 &axisData[0][0]
,数组元素将按以下方式访问:
axisData[0][0]
是&axisData[0][0]
。axisData[0][1]
是&axisData[0][0] + 1
。axisData[0][2]
是&axisData[0][0] + 2
。axisData[0][3]
是&axisData[0][0] + 3
。axisData[1][0]
是&axisData[0][0] + 4
。axisData[1][1]
是&axisData[0][0] + 5
。- ...
4. 总结:
在 C 语言中,二维数组是按 行主序(row-major order) 存储的,即所有的行按照顺序连续存储在内存中。对于一个 mxn
的二维数组 arr[m][n]
,数组的第一个元素 arr[0][0]
存储在内存的起始位置,紧接着是 arr[0][1]
、arr[0][2]
等,直到 arr[0][n-1]
。然后,存储的是 arr[1][0]
、arr[1][1]
,以此类推,直到 arr[m-1][n-1]
。