【原文】http://blog.csdn.net/shanzhizi/article/details/7835752
數組的動態分配、初始化和釋放經常用到,這里總結一下,尤其是二維數組
一維數組
一維數組的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明。具體如下:
動態分配:?int *array=new int [n];
初始化:memset(array,0,n*sizeof(array)); ? ? ? (也可以利用一個for循環對其賦值初始化)
撤銷:delete [] array;
二維數組
下面來說二維數組的。
動態分配:二維數組(n行m列)利用new來進行動態分配實際上相當于對n個m元數組進行動態分配,只不過我們不能一味的按照動態分配一維數組的方法來進行這項操作。MSVC目前還沒有這般的人性化,具體應該這樣做:
[cpp]?view plaincopy
int?**array;??array=new?int?*[10];??for(int?i=0;i<10;i++)?????array[i]=new?int?[5];??上面的操作完成了一個10行5列的二維數組array[10][5]的動態分配,可以看到我們先動態分配了一個10單元的數組的指針的指針的首地址給**array,然后再對其每個首地址進行遍歷,同時完成一個5單元的數組的動態分分配,并把首地址給*array[i],從而最終完成了二維數組array[10][5]的動態分配。我們可以依此類推得到三維以至多維的數組的動態分配方法。
初始化:如果把一維數組初始化辦法照搬過來就會發現對于動態分配的二維數組并不適用。這就要理解到memset這個函數三個參數的含義。MSDNhttp://blog.csdn.net/shanzhizi對memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
可見memset只能作用于一個一維數組void *dest,因此最好的辦法就是和二維數組的動態分配結合起來,new一個,memset一個。我的理解是memset只作用于一塊連續的內存空間,而動態開辟的空間不一定是連續的,所以具體寫法如下:
[cpp]?view plaincopy
int?**array;??array=new?int?*[10];??for(int?i=0;i<10;i++)??{??????array[i]=new?int?[5];??????memset(array[i],0,5*sizeof(int));???}??可以看到這里的memset的第三個參數有了變化。
撤銷:
[cpp]?view plaincopy
for?(int?i?=?0;?i?<?10;?i?++)??{???????delete[]?array[i];??}??delete?[]?array;??三維數組
類似于二維數組,用一個例子說明:
[cpp]?view plaincopy
#include?<stdio.h>??#include?<memory.h>??#define?size1?5??#define?size2?10??#define?size3?15??int?main()??{?????????int?***?arr;?????????int?i,j,k;??????????????????arr?=?new?int**[size1];?????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????arr[i]?=?new?int*[size2];????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????arr[i][j]?=?new?int[size3];????????????????}?????????}??????????????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????for?(k?=?0;?k?<?size3;?k?++)?{??????????????????????????????arr[i][j][k]?=?i?*?j?*?k;???????????????????????}????????????????}?????????}?????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????for?(k?=?0;?k?<?size3;?k?++)?{??????????????????????????????printf("i*j*k=%d*%d*%d=%d/n",i,j,k,arr[i][j][k]);???????????????????????}????????????????}?????????}??????????????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????memset(arr[i][j],-1,sizeof(int)?*?size3);????????????????}?????????}?????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????for?(k?=?0;?k?<?size3;?k?++)?{??????????????????????????????printf("i,j,k=%d,%d,%d=%d/n",i,j,k,arr[i][j][k]);???????????????????????}????????????????}?????????}??????????????????for?(i?=?0;?i?<?size1;?i?++)?{????????????????for?(j?=?0;?j?<?size2;?j?++)?{???????????????????????delete[]?arr[i][j];????????????????}????????????????delete[]?arr[i];?????????}?????????delete[]?arr;?????????return?0;??}??
總結
以上是生活随笔為你收集整理的C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。