虽然已经有人写过,但毕There are a thousand Hamlets in a thousand people's eyes. 希望大家静下心来看完,进入正题。
大家学数组时老师一定讲过数组在内存里是怎么排布的吧,我当时就好奇问了老师这么个问题:“老师,你说一维数组是按顺序排布在内存里,二维数组是按行存储在内存里,那么三维数组呢?”老师回答:“你可以把三维数组看成一本书.....,还没等我再问,老师紧接着说四维及以上的我还没有找到模型…..”。呵呵,估计你们也有相似的经历呢。估计有人会说:“n维数组用不到,不用搞那么深”。且先不管用不用的到,技多不压身嘛。
引子
一维数组:
char temp[8]={'a','b','c','d','e','z','l','l'};
定义了一个名为temp的一维数组,来看看其元素在内存中的分布。
进阶
二维数组:
char temp[3][3];
int i,j,k='a';
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
temp[i][j]=k;
k++;
}
}
那么二维数组又是如何分配的呢?先别急,我们先来理论分析一下,如下图:
接下来这张图是内存的真实写照:
次高阶
三位数组,为了好画图,也为了好让大家懂,我就定义一个简单点的数组
char temp[2][2][2];
int i,j,n,k='a';
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
for(n=0;n<2;n++)
{
temp[i][j][n]=k;
k++;
}
}
}
这回我们不先讲解理论而是逆道而行之,先看看内存中是如何存的,由实践总结出一般规律来,Come On Guys.老规矩,上图:
对呀,temp[1][1][0]究竟是多少呢?下面我们就来研究研究,计算机到底是按什么顺序来存放数据的呢?(当然是按顺序啦,我的意思是是按什么规律将temp[i][j][m]与每个元素对应起来的),好了,还是图形来的直观,大家看图吧:
现在知道temp[1][1][0]是什么了吧。
高阶
没有了。没有了?对,没有了,你把三阶的研究透,四维的甚至n维的你自然也就会了,我又何必在这废话连篇浪费你的宝贵时间呢?不过,我还是想给你们个总结。呵呵,说上就上。
总结:
通常,我们分析n维数组时是按下面这个步骤来做的:
Step one:
画一条直线,按数组最低维数将直线分成相应的几段,如temp[4][3][2][5],则先将数组分成4段,注意这三根竖线画的最长,以示他们是“根”;
Step two:
接着将分好的每段在接着按次低位再重复Step one,但这几根竖线画的比上级的短些,以示他们是次低位;
Step three:
重复即可
Step last:
标号,按竖线的高低分别标上相应的“根维地址”,这句话有点绕,就看上面的图就好。
说到底计算机它并不管你几维的,它只按线性顺序存储,而作为有思想有我们却
不能像个mechine那样mechanical,对吧。至于我将的这个到底有没有用,问问你自己temp[1][1][0]现在是否知道是什么了,如果知道了,那将的有没有用,就全在个人咯……..
大家是喜欢看文字,还是图形啊?这次我就自作主张了,以图为主,大家给个意见,呵呵
下讲:吾思过吾在之n指针的寻秘
期待ing me and you……