当前位置:C++技术网 > 资讯 > 吾思过吾在之n维数组的寻秘

吾思过吾在之n维数组的寻秘

更新时间:2015-06-26 13:02:08浏览次数:1+次

    虽然已经有人写过,但毕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……