對於二維數組和二維指針的內存的分配
這里首選說一下一維指針和一維數組的內存分配情況。
一維:
數組:形如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 }
用的最多的就是上面的幾種方法。一次性分配二維數組的內存還有多種方法可以實現。我也是剛接觸這些東西,希望大家能提出不正確的地方。共勉!!!
