您的位置:首页 > 其它

二维指针、数组指针和指针数组存储空间的动态分配和释放

2017-07-28 19:55 489 查看
1、二维指针

二维指针也就是指针的指针,动态分配和释放如下:

void fun()

{

int i;

X **a;

//分配

a = (X **)malloc(sizeof(X *) * m);    //也可以写成 a = new X*[m];

for(i = 0; i < m; i++)

a[i] = (X *)malloc(sizeof(X) * n);   //对应的写成a[i] = new X
;

//释放

for(i = 0; i < m; i++)

delete[] a[i];  //对于一般类型的指针 delete[] a[i]; 与delete a[i];意思一样,对于类对象指针来说就有区别,所以都以程序中的格式来写。

delete[] a;

}

2、数组指针

数组指针它本质是指针,指向一个一维的数组。看成二维的来讲的话,它已经已知了第二维。

void fun()

{

X (*a) [m];

//分配

a = new (X(*)[m])
;//或者a = new X
[m]

//释放

delete[] a;  //因为它本质是一个指针,只是为这个指针分配了一串空间,所以就有每一个地址都指向一个数组,这样看起来就是二维啦。

                          //所以释放的时候直接delete[] a就可以了,把以a[0]为起点的那一串指针都释放了。

}

3、指针数组

指针数组本质是数组,数组的每个值都是指针,分配地址要做的就是要给数组中的指针分配一串空间。在存储空间上的关系如下:

int *a[m];

假如现在给每个指针都分配了n个连续空间,a[0]~a[m]都是数组的值,在指针数组声明的时候它是随机值,跟普通的数组一样,当分配空间的时候它才具有真正的值,

数组名a的值是a[0]的地址&a[0];a[0]~a[m]的地址,即&a[0]~&a[m]是连续的,跟普通数组原理相同,a[0]、a[1]....这些是每个数组中值的首地址,即a[0] = &a[0][0],a[1] = &a[1][0]

这样,指针数组的存储空间就屡清楚了。

下来看它的动态分配和释放。

void fun()

{

int i;

X *a[m];

//分配

for(i = 0; i < m; i++)

a[i] = new X
;

//释放

for(i = 0; i < m; i++)

delete[] a[i];  //数组的每一个值都分配了一串地址空间,所以要把所有a[i]的空间[](跟上面一样,为了保险起见),delete掉。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 malloc
相关文章推荐