如何动态创建数组

转载 2015年07月08日 15:41:58

    

                                 

分类: 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;

}

创建动态数组

数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道其长度,数组只在定义它的块语句内存在。实际的程序往往不能忍受这样的限制——它们需要在运行时动态地分配数组。虽然数组长度是固定的,但动态...
  • sj19890401
  • sj19890401
  • 2014年01月03日 10:55
  • 923

如何动态创建数组

我们知道在C或C++里,有时候我们要定义的数组的长度是不定的,所以要动态地创建数组,也就是在运行的时候动态分配内存。 我们常用的是对一维或二维数组动态的创建,但毕竟有时候我们要对更多维的数组进行动态...
  • zzyoucan
  • zzyoucan
  • 2013年01月20日 12:05
  • 13200

一维动态数组和二维动态数组的创建和使用

c,c的动态数组,一维数组,二维数组
  • wj903829182
  • wj903829182
  • 2014年07月17日 08:09
  • 1681

Java动态数组的用法详解

Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList。下面介绍一下ArrayL...
  • u010454729
  • u010454729
  • 2014年04月27日 21:34
  • 3049

C++建立动态二维数组

C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组                           int...
  • longshengguoji
  • longshengguoji
  • 2013年09月05日 14:05
  • 45108

静态数组不能扩容(realloc),动态的才可以(如何创建动态数组)

一、静态数组不能扩容 新分配在堆内的内存,数组定义之后不能改变大小,realloc(p,sizeof(p)+sizeof(int))函数不会改变p的值,新的内存地址是函数的返回值: int a[4...
  • WXXGoodJob
  • WXXGoodJob
  • 2017年07月04日 11:11
  • 932

C语言动态数组原理及实现

近来编写几个程序,很多都用到了数组。但是对于数组的大小却是没有固定的,也就是说可以更改数组大小,其大小是可以变化的。并不像初学时的那样,告诉你一个范围,你就必须取最大值以满足要求。那样可能就会浪费很多...
  • u013398034
  • u013398034
  • 2016年07月11日 16:48
  • 6457

char数组的赋值操作&动态储存建立删除

一.字符数组的赋值问题 1.对单个元素进行赋值。 char s[10]; s[0]='g'; s[1]='o'; s[2]='o'; s[3]='o'; s[4]='\0';s="good" //错误...
  • qq_41233726
  • qq_41233726
  • 2017年12月12日 15:00
  • 29

C语言实现动态创建二位数组

在C语言中动态的一位数组使用malloc动态分配空间来实现的。实际上,C语言中没有二维数组或者说至少对二维数组没有直接的支持。而是将二维数组转换为一位数组的数组。如:编译器会将a[1][3]解释为 *...
  • A_cainiao_A
  • A_cainiao_A
  • 2013年12月26日 17:17
  • 953

C语言动态申请三维数组的三种方法

方法一:用数组指针形式申请一个三维数组。 #include #include int main() { int i,j,k; int value...
  • qq_29545231
  • qq_29545231
  • 2017年11月29日 11:02
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何动态创建数组
举报原因:
原因补充:

(最多只允许输入30个字)