
2020-12-12(c++多维数组的反编译观察)
其实大家看了之后,是不是感觉都一样呀。。。唉,其实呢,就不存在什么二维数组,三维数组,四维数组什么的,都是线性存储。 总结一句话来说,也就是(二维数组是由n个一维数组构成,三维数组是由n个二维数组构成,四维数组是由n个三维数组构成……)以此类推,只不过呢,他们各自指针+1后 的值不一样(即步长不一样) 跟大家慢慢解释如何数组拆分理解: 整型二维数组 int nArray[2][3]可拆分为三部分: 数组的首地址:nArray 一维元素类型:int [3]
发布日期:2021-05-07 12:06:33
浏览次数:23
分类:技术文章
本文共 1003 字,大约阅读时间需要 3 分钟。
c++一维数组的话,大家都知道,就把数组内容存放在相应的内存地址所对应的地址单元中,举个例子:nArray[4]={1,2,3,4}存储如下:

- 类型: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 的偏移地址,然后我们近一步把这个二维化成一维,最后把它们相加,理解?大家评论区见吧
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月25日 21时12分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android 联合ViewPager 与 Fragment
2019-03-04
2.4 大电路静态工作点的稳定
2019-03-04
汉诺塔 C++实现【STL stack】
2019-03-04
数据结构——链表
2019-03-04
[数据结构与算法]链表逆置与遍历
2019-03-04
CommonJs
2019-03-04
Unicode编码和Base64编码
2019-03-04
html基础
2019-03-04
ICMP网际控制报文协议
2019-03-04
[编程题]Course List for Student (25)
2019-03-04
Python【面向对象】1
2019-03-04
【Python】面向对象,封装
2019-03-04
接口又是个啥?
2019-03-04
JS中如何创建对象
2019-03-04
二叉树的基础练习题代码
2019-03-04
(JAVA小白必看)小白IDEA的安装与配置
2019-03-04
SpringMVC模板代码
2019-03-04
C++ Primer学习笔记——第2章 变量和基本数据类型
2019-03-04
5.11 TEST1
2019-03-04