很久没用C++刷题了,今天早上刷了几条题,感受很陌生了。怪我,大二下实在太颓废了,没啥做为。html
今天更新个关于c++二维数组内存申请的问题,当初做为菜鸟初学指针的时候,仍是在这方面有点搞不通的。今天用到了,顺便写下来,适当时候给C++初学者用用。c++
-----------C++二维数组动态申请内存--------------数组
若是对new和delete不是很了解的话能够到这里来看看,http://www.cnblogs.com/hazir/p/new_and_delete.htmlspa
首先,咱们通常须要用到数组的时候,都是直接声明,好比:指针
1 int array[3][3];
可是,在某些状况下,数组的维数咱们是不知道的,多是等待用户输入维数,这时候须要用变量来指定维数了。但是,咱们不能直接这样声明数组,由于C++不容许直接用变量做为维数声明,必须用常量,像这样就会报编译错误:code
这时候就须要用new来动态申请数组了。咱们一步一步来,申请一维数组的时候,咱们能够这样写:htm
int num = 3; int* array = new int[num];
这段代码的意思就是,用new来申请num个int类型的空间,而后返回那段空间的首地址,再赋给array。可见array是一个int类型的指针,指向那段空间的首地址。语法和逻辑无误,正常运行。blog
可是,申请二维数组的时候,就可能要对指针这一知识点要掌握得比较好一点,理解得比较透彻。先贴代码,再分析:内存
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;
好吧!我已经尽可能讲得很详细了!其实这段代码不难,认真思考一下就好了。但是我仍是苦口婆心的很仔细的讲了,可能为了之后和我同样的菜鸟刚学指针时有缘看到这篇博客能够对他有些帮助吧,其实我已经对这个烂熟于心了,为何还要这么仔细得写呢?会不会浪费时间浪费精力?我不知道,可能再熟悉再小的问题,也可能会有本身不懂的学问在里面吧。总之,每篇博客,尽可能写到最好!
停笔!过几天会更新关于new和delete的知识点!