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 的偏移地址,然后我们近一步把这个二维化成一维,最后把它们相加,理解?
大家评论区见吧
本文详细解析了C++中一维、二维乃至更高维度数组的存储原理,通过具体实例介绍了如何计算不同维度数组中元素的偏移地址,并提供了计算公式。
276

被折叠的 条评论
为什么被折叠?



