C++二維數組動態內存分配

對於二維數組和二維指針的內存的分配ios

這裏首選說一下一維指針和一維數組的內存分配狀況。數組

一維:spa

數組:形如int  a[5];這裏定義了一個一維數組a,而且數組的元素個數是5,這裏的a是這五個元素的總體表示,也就是經過a咱們能找到這五個元素。注意:a是表明數組第一個元素的首地址。&a是表明數組的地址,雖然它們的值相同。指針

指針: int *p = NULL;這裏p是一個指針,它指向的是計算code

機內一塊存儲int類型的內存。P = a;就是讓p等於剛纔申請的數組的第一個元素的地址。因此經過p咱們也能找到那5個元素因此P[i]跟a[i]的做用同樣。blog

注意:內存

1:int *p = NULL; p的大小在32位機器是4,即便p=a;以後p的sizeof(p)仍然等於4。io

2:在聲明以後,數組必須分配內存進行初始化。而指針通常是動態分配其指向的內存。class

3:不要混淆指針和數組,指針就是指針,數組就是數組,只是數組在必定條件下能夠轉換成指針。不要將指針和數組混淆。(例如:指針有++,--操做,數組則不能夠)。test

一維指針的動態內存分配:

int *p = NULL;

p = new int[N];

千萬別忘了delete

delete [] p;

p = NULL;

二維數組的內存分配

int a[2][3];   這裏分配了一個2X3=6個int大小的數組。二維數組的第二個維度3不能省略。

二維數組的內存在計算機內也是連續的一片地址,只不過每3個元素構成一個一維數組a[i],這裏的a[i]表明維度爲3的數組的第一個元素的地址。因此a[i][j]的訪問跟a[i]的訪問也就清楚了。這裏的a[i]實際上是一個一維數組的第一個元素的地址。

對於二維數組作實參,咱們一般用一維指針處理,例如:

 1 #include <iostream>
 2 void test(int *p)
 3 {
 4     for (int i = 0;i<3;++i)
 5     {
 6         for(int j = 0;j<3;++j)
 7         {
 8             std::cout<<*(p+3*i+j); //一維處理
 9         }
10     }
11 }
12 int main(void)
13 {
14     int a[3][3]={1,2,3,4,5,6,7,0,0};
15     test((int*)a);     //將二維數組當作一維處理
16     system("pause");
17     return 0;
18 }

這些想必書上講的都很是清楚。

 

二維數組的C++動態內存分配。

二維指針的動態數組分配:二維指針相似指針數組的分配

int **p;

 1 #include <iostream>
 2 int main(void)
 3 {
 4     int **p = NULL;       //這裏申請一個3x4的二維數組
 5     p = new int *[3];     //分配一維指針,分配三個int* 類型的一維指針。 
 6     for (int i = 0;i < 3; ++i)
 7     {
 8         p[i] = new int[4];
 9     }
10     for (int i = 0; i < 3; ++i)
11     {
12         for(int j = 0; j < 4 ; ++j)
13         {
14             p[i][j] = i*j;
15             std::cout<<p[i][j]<<" ";
16         }
17         std::cout<<std::endl;
18     }
19     
20     for (int i = 0;i < 3;++i)    //釋放
21     {
22         delete [] p[i];
23     }
24     delete [] p;
25     system("pause");
26     return 0;
27 }

 

指針數組的動態內存分配

指針數組的動態內存分配只須要對指針數組的數組元素指針分別分配內存便可,比二維指針的分配少了一個環節。

 1 #include <iostream>
 2 int main(void)
 3 {
 4     int *a[3];    //申請含有三個int* 類型的指針數組
 5                   //跟二維指針不一樣的是,這裏數組a不用手動申請內存
 6     for (int i = 0;i < 3;++i)  //申請一個3x4的空間
 7     {
 8         a[i] = new int[4];
 9     }
10     for (int i = 0; i<3 ;++i)
11     {
12         for (int j = 0; j<4; ++j)
13         {
14             a[i][j] = i*j;
15             std::cout<<a[i][j]<<" ";
16         }
17         std::cout<<std::endl;
18     }
19 
20     for (int i = 0;i <3 ;++i)  //分別釋放三個指針元素,因爲數組在棧區,會自動釋放
21     {
22         delete [] a[i];
23     }
24     system("pause");
25     return 0;
26 }

 

數組指針的動態內存分配

數組指針就是指向數組的指針,說白了就是指向一個數組總體,所以分配的時候直接申請一片內存地址便可。跟二維數組的靜態分配相似。

1 // Karllen 
2 int main(void)
3 {
4     int (*a)[4];     //這裏的4是第二維的維度,a的增量的基數爲4個int
5     a = new int[3][4];      
6     delete []a;
7         a = NULL;
8     return 0;
9 }

用的最多的就是上面的幾種方法。一次性分配二維數組的內存還有多種方法能夠實現。我也是剛接觸這些東西,但願你們能提出不正確的地方。共勉!!!

相關文章
相關標籤/搜索