C++中的二维数组动态分配内存

来源:互联网 发布:核盾网络验证qq群答案 编辑:程序博客网 时间:2024/06/08 05:09
首先,我们一般需要用到数组的时候,都是直接声明,比如:
1 int array[3][3];

  但是,在某些情况下,数组的维数我们是不知道的,可能是等待用户输入维数,这时候需要用变量来指定维数了。可是,我们不能直接这样声明数组,因为C++不允许直接用变量作为维数声明,必须用常量,像这样就会报编译错误:

 

  这时候就需要用new来动态申请数组了。我们一步一步来,申请一维数组的时候,我们可以这样写:

int num = 3;int* array = new int[num];

  这段代码的意思就是,用new来申请num个int类型的空间,然后返回那段空间的首地址,再赋给array。可见array是一个int类型的指针,指向那段空间的首地址。语法和逻辑无误,正常运行。

  但是,申请二维数组的时候,就可能要对指针这一知识点要掌握得比较好一点,理解得比较透彻。先贴代码,再分析:

  

  int num = 3;  int** array = new int*[num];  for(int i=0; i<num; ++i) {    array[i] = new int[num];  }

  看完这段代码,还是有点糊涂的。为什么array是int**类型?为什么还要用循环来分配空间?我们再来看下面注释版的代码:

  

复制代码
  int num = 3;  (int*)* array = new int*[num];  // 申请int*类型数组的内存空间,赋值给(int*)*类型的array  for(int i=0; i<num; ++i) {    array[i] = new int[num];  // 分别给int*类型的数组申请空间,即一维数组的动态申请。  }
复制代码

  现在我来解释一下,其实我们可以把二维数组理解成为很多一维数组的集合。比如说:int array[4][3],其实它就是由4个长度为3的一维数组组成的。array[0]指的就是第一个一维数组。可以推出,array[0],array[1],array[2], array[3]就是int*类型的指针,用来分别指向一维数组。那么,array又是什么呢?很显然,array就是(int*)*类型的指针,指向刚才那4个int*指针类型占用空间的首地址。有点绕?看图:

  因此,联系上图,我们先new4个int*类型,将首地址赋值给array。再用循环每次new4个int类型,首地址指向对应的int*类型的指针。

  了解之后,我们当然要用delete释放内存,就不细说了,怎么申请怎么释放,并且是逆着回来释放空间,看代码:

 for(int i=0; i<num; i++) {  delete[] array[i]; } delete[] array;