关闭

如何动态创建数组

125人阅读 评论(0) 收藏 举报
分类:

    

                                 

分类: pure c++ 2410人阅读 评论(1) 收藏 举报

我们知道在C或C++里,有时候我们要定义的数组的长度是不定的,所以要动态地创建数组,也就是在运行的时候动态分配内存。
我们常用的是对一维或二维数组动态的创建,但毕竟有时候我们要对更多维的数组进行动态地创建的(尽管少用)。
对于一维数组p[n]的动态创建:
    char *p=new char[n];
对于二维数组p[n][m]的动态创建:
    char **p=new char*[n];
    for(int i=0;i<n;i++)
        p[i]=new char[m];
其实一维二维的创建都比较简单,但如果是4维或5维呢?这往往使初学者不知所云。其实只要我们从中找出规律后,就一通百通了。
往往,我们对同一件事物,以不同的看法看它,就有不同的收获或不同的见解。而对于抽象的事物,我们要建立自己的模型,模型建立得好坏,对问题是否能够得到解决有很大的影响。
结构体我们都懂,其实我们也可以把数组“看成"是结构体,比如数组a[8],可以看成是一个有八个相同类型成员的结构体;如数组a[n][m]可以看成是一个有n个类型为一维数组的成员的结构体,而每个成员可以看成是

一个有m个相同类型成员的结构体,…………。这样,对于一个N维的数组,可以把它看成一个有N层的树,我们实际的数据存在树的叶结点里,而树的每一层是我们动态创建的,比如数组a[i1][i2][i3]……[N-2][N-1][N],第

一层个数为i1,第二层个数为i1*i2,第N层个数为i1*i2*……*N。所以,维数越多,时间和空间上都增长得非常快,而且我们一般也很少用到多维的动态数组,但是,尽管这样,这种模型是有利于我们对多维数组以及它的动态创建的理解的,。下面就说说如何以这样的模型或思维方式动态创建四维的数组p[n][m][p][t]:

     char****p=new char***[n];//首先创建一个根结点,类型为char****,它指向一个有n个元素且类型为char***的数组(或每个成员都为char***类型的结构体)
     for(int i=0;i<n;i++)//创建第二层树结点,每个结点的类型为char***,它指向一个有m个元素且类型为char**的数组(或每个成员都为char**类型的结构体)
    {
          p[i]=new char**[m];
         for(int j=0;j<m;j++)//创建第三层树结点,每个结点的类型为char**,它指向一个有q个元素且类型为char*的数组(或每个成员都为char*类型的结构体)
         {
        p[i][j]=new char*[q];
for(int k=0;k<q;k++)//创建第四层树结点,每个结点的类型为char*,它指向一个有t个元素且类型为char的数组(或每个成员都为char类型的结构体)
{
       p[i][j][k]=new char[t];
                }
         }
    }
到此,这个四维的数组就创建完成了,我们可以给n,m,p,t赋一定的值,就创建一个大小为n*m*p*t的数组了,然后我们就可以如这样:*p[i][j][k]=value;存入我们的值了

回收内存时也简单,和分配的时候刚好相反,如下:

int t1=n,t2=m,t3=q;
for(i=0;i<n&&t1;i++)
{
   for(int j=0;j<m&&t2;j++)
   {
    for(int k=0;k<q&&t3;k++)
     delete p[i][j][k],t2--;
    delete p[i][j],t3--;
   }
   delete p[i],t1--;
}
delete [] p;

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5018次
    • 积分:148
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:12篇
    • 译文:0篇
    • 评论:0条
    文章分类