(轉自: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 }
用的最多的就是上面的幾種方法。一次性配置設定二維數組的記憶體還有多種方法可以實作。我也是剛接觸這些東西,希望大家能提出不正确的地方。共勉!!!