前言
因为需要解决一个问题,所以决定对合并数组/非合并数组以及混合场景进行进行探索。
问题
已知一个多维混合数组的定义为:
那么当我们写下
的时候,到底是对哪个位置赋值了??
话不多说,直接看解答好啦~最后的答案其实很简单,因为有一个简单的图示估计很多人知道,就是逆时针索引法:
因此可以得到结论:
好的,接下来进入学习时间,拿出书搞一搞。
非合并数组
当索引位于数组名称后方时候,我们定义的就是非合并数组:
其实我觉得上面这个数组可以认为是混合数组了,毕竟左侧也有索引,所以不妨用这个方式做示例,二者在内部存储上是等价的:
非合并数组在数据存储中,一般以字为边界(即32bit)来存储数据,典型的byte/int/shortint都是存储在一个字中,longint因为超出了一个字的边界因此存储在两个字当中(64bit空间)。如果数组元素位宽不足一个字,则使用低位存放数据,高位闲置不用。
非合并数组由于存储空间并不连续,因此无法对整体赋值只能够分开赋值,比如下面这种写法会报编译错误:
多维的非合并数组
由于非合并数组是独立空间存储的,那么多维的也很好理解,牢记上面的逆时针索引规则,对于:
可以直接理解为:独立的4个(独立的5个(独立的6个位宽为1byte的数据)),那么也就是4*5*6个byte独立数据。
合并数组
如果想能够整体进行赋值的话,那么就必须使用合并数组来进行定义,把数组名称右边的索引移到左边最前面去就可以了:
此时合并数组的存储方式为:
那么更多维的合并数组也就很好理解了,就是在二维合并数组的基础上继续拼接,索引的时候按照逆时针原则从左往右看。
来看一个简单的例子:
先预期以下,array3是被定义的8bit合并数组(2*2*2),整体赋值之后应该被赋值为下图形式:
此时我们如果取值array3[1]则会取到6,取值array3[1][1]则会取到1;
那么我们上机跑一下遍历打印看看:
跟我们的预测是一摸一样的:
混合数组
合并和非合并数组都研究的差不多了,最后就可以看下混合数组。其实看混合数组时候就是先看右侧的非合并数组,再看左侧的合并数组,看数组时都是从左往右看,那么总结起来就是逆时针规则了。
因此我认为前面理解清楚后,就没必要继续写了~~~
领取专属 10元无门槛券
私享最新 技术干货