概述
我们知道在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;
}
最后
以上就是平常戒指为你收集整理的如何动态创建数组的全部内容,希望文章能够帮你解决如何动态创建数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复