C语言:二维数组在内存中是怎么存储的

目录

1. 二维数组的定义:

2. 行主序存储:

具体内存排列:

3. 如何通过指针访问数据:

4. 总结:


在 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,那么它的内存布局将是:

内存地址数据
0x1000axisData[0][0]
0x1004axisData[0][1]
0x1008axisData[0][2]
0x100CaxisData[0][3]
0x1010axisData[1][0]
0x1014axisData[1][1]
0x1018axisData[1][2]
0x101CaxisData[1][3]
0x1020axisData[2][0]
0x1024axisData[2][1]
0x1028axisData[2][2]
0x102CaxisData[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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魂兮-龙游

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值