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 }

用的最多的就是上面的几种方法。一次性分配二维数组的内存还有多种方法可以实现。我也是刚接触这些东西,希望大家能提出不正确的地方。共勉!!!

猜你喜欢

转载自blog.csdn.net/biqioso/article/details/83104941