二维指针、数组指针和指针数组存储空间的动态分配和释放
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掉。
}
二维指针也就是指针的指针,动态分配和释放如下:
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掉。
}
相关文章推荐
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- C++编程入门系列之三十二(数组、指针和字符串:动态内存分配和释放)
- C语言中动态分配数组指针后如何释放
- 三十二、数组、指针和字符串:动态内存分配和释放
- 动态数组空间释放——指针误操作
- 存储空间的动态分配与释放
- C语言动态存储分配空间作为数组
- 数组不是指针——数组地址不能动态分配空间,一个小例子关于指针移动,以及malloc
- 数组、指针和字符串:动态内存分配和释放
- 鸡啄米:C++编程入门系列之三十二(数组、指针和字符串:动态内存分配和释放)
- C++ 动态存储空间的分配和释放 new与malloc的区别
- C++之存储空间的动态分配和释放
- 存储空间的动态分配与释放
- C语言中动态分配数组指针的释放问题
- c语言中内存的动态分配与释放(多维动态数组构建)
- 用new和delete运算符进行动态分配和撤销存储空间
- 指针数组,数组指针,以及函数指针,以及堆中的分配规则(转载)
- 指针分配和释放空间(转)
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟