2020-12-12(c++多维数组的反编译观察)

本文详细解析了C++中一维、二维乃至更高维度数组的存储原理,通过具体实例介绍了如何计算不同维度数组中元素的偏移地址,并提供了计算公式。

c++一维数组的话,大家都知道,就把数组内容存放在相应的内存地址所对应的地址单元中,举个例子:nArray[4]={1,2,3,4}存储如下:在这里插入图片描述
但c++二维数组存储方式大家想过有什么不同的吗?nArray[2][2]={1,2,3,4}存储如下
在这里插入图片描述
其实大家看了之后,是不是感觉都一样呀。。。唉,其实呢,就不存在什么二维数组,三维数组,四维数组什么的,都是线性存储。
总结一句话来说,也就是(二维数组是由n个一维数组构成,三维数组是由n个二维数组构成,四维数组是由n个三维数组构成……)以此类推,只不过呢,他们各自指针+1后 的值不一样(即步长不一样)
跟大家慢慢解释如何数组拆分理解:
整型二维数组 int nArray[2][3]可拆分为三部分:
数组的首地址:nArray
一维元素类型:int [3]

  • 类型:int
  • 元素个数:[3]
    一维元素个数:[2],此下标值记作i
    大家在这里会不会有点难区分这两个个数呢?我来解释一下:
    元素个数[3]:这里指的是拆分出来的 一维数组里元素个数为3个
    一维元素个数:这里指的是这个二维数组可以拆分出 2 个一维数组

则不管我们计算几维数组的元素偏移(即寻址)时,可得公式:
数组首地址+sizeof(type[j]) 二维下标值 +sizeof (type ) 一维下标值**
这个公式什么意思呢,我来举个例子:

例如int a[5][6]的二维数组中,我要找到int a[2][3]的偏移时:
数组首地址 + sizeof (int[6]) * 2 +sizeof(int) 3
近一步=数组首地址+sizeof(type)
(2*6+3)
(这个可以类比成公式哦,二维三维四维更多都行滴)
在这里插入图片描述

此汇编代码 lea eax ,[ecx+edx*2]足以证明一切

切记切记,别把一维下标值和二维下标值理解反了,这里切记要理解,不能背,背的话那就失去了反编译的意义。

所以当我们遇到三维数组时,怎么理解呢?
int a[4][5][6]中去寻找 int a [2][3][4]的偏移,下方评论区写出你的答案吧?
(首先把三维化成二维,再把二维分为一维)
也就是这个int a[2][3][4]包含了 2个 int [5][6]的偏移地址 +3个int [6]的偏移地址 + 4个int 的偏移地址,然后我们近一步把这个二维化成一维,最后把它们相加,理解?

大家评论区见吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻梦&之璐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值