1. 程式人生 > >C++二維陣列動態記憶體分配【轉】

C++二維陣列動態記憶體分配【轉】

(轉自:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3753566.html

 

    /*申請3行4列的二維陣列記憶體*/
    int **array;
    array = new int *[3];/*先申請3個int*型別的一維指標,作為行*/

    for (i = 0; i < 3; i++) {/*再為每一行申請一個 擁有4個int型空間 的陣列*/
        array[i] = new int [4];
    }

    for (i = 0; i < 3; i++) {
        delete [] array[i];/*釋放3個指標*/
    }
    delete []array;/*釋放陣列*/

 

對於二維陣列和二維指標的記憶體的分配

這裡首選說一下一維指標和一維陣列的記憶體分配情況。

一維:

陣列:形如int  a[5];這裡定義了一個一維陣列a,並且陣列的元素個數是5,這裡的a是這五個元素的整體表示,也就是通過a我們能找到這五個元素。注意:a是代表陣列第一個元素的首地址。&a是代表陣列的地址,雖然它們的值相同。

指標: int *p = NULL;這裡p是一個指標,它指向的是計算

機內一塊儲存int型別的記憶體。P = a;就是讓p等於剛才申請的陣列的第一個元素的地址。所以通過p我們也能找到那5個元素所以P[i]跟a[i]的作用一樣。

 

注意:

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

2:在宣告之後,陣列必須分配記憶體進行初始化。而指標一般是動態分配其指向的記憶體。

3:不要混淆指標和陣列,指標就是指標,陣列就是陣列,只是陣列在一定條件下可以轉換成指標。不要將指標和陣列混淆。(例如:指標有++,--操作,陣列則不可以)。

一維指標的動態記憶體分配:

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 }

 

用的最多的就是上面的幾種方法。一次性分配二維陣列的記憶體還有多種方法可以實現。我也是剛接觸這些東西,希望大家能提出不正確的地方。共勉!!!