C++二维动态数组的申请与 释放

上传人:德****1 文档编号:1089326 上传时间:2017-05-27 格式:DOC 页数:10 大小:47KB
返回 下载 相关 举报
C++二维动态数组的申请与 释放_第1页
第1页 / 共10页
C++二维动态数组的申请与 释放_第2页
第2页 / 共10页
C++二维动态数组的申请与 释放_第3页
第3页 / 共10页
C++二维动态数组的申请与 释放_第4页
第4页 / 共10页
C++二维动态数组的申请与 释放_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《C++二维动态数组的申请与 释放》由会员分享,可在线阅读,更多相关《C++二维动态数组的申请与 释放(10页珍藏版)》请在金锄头文库上搜索。

1、一维数组是指针,可将二维数组看作是指针的指针:每一行是一个一维数组,而列是指向行的指针。在动态创建时,先分配指向行的指针空间,再循环维每一行申请空间。#include using namespace std;int main()/34 /三行四列的二维数组int x,y;int i,n,k;x=3;y=4;int *p;p = new int*x; /行 /申请行的空间/每行的列申请空间for(i=0; i 1、new 运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。2、一般定义变量和对象时要用标识符命名,称命

2、名对象,而动态的称无名对象(请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的)。 3、堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化。new 表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。 下面是从堆中申请数组 1、申请数组空间: 指针变量名=new 类型名下标表达式; 注意:“下标表达式”不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。这就是堆的一个非常显著的特点,有的时候程序员本身都不知道要申请能够多少内存的时候,堆就变的格外有用。 2、释放数组空间:

3、delete 指向该数组的指针变量名; 注意:方括号非常重要的,如果 delete 语句中少了方括号,因编译器认为该指针是指向数组第一个元素的,会产生回收不彻底的问题(只回收了第一个元素所 占空间),我们通常叫它“内存泄露”,加了方括号后就转化为指向数组的指针,回收整个数组。delete 的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。上说过以前的 delete 方括号中是必须添加个数的,后来由于很容易出错,所以后来的版本就改进了这个缺陷。 下面是个例子,VC 上编译通过 #include using namespace std; /#include /for VC #incl

4、ude void main() int n; char *p; coutn; /n 在运行时确定,可输入 17 p=new charn; /申请 17 个字符(可装 8 个汉字和一个结束符)的内存空间strcpy(pc,“堆内存的动态分配”);/ coutn; pc2=new CGoodsn; /动态建立数组,不能初始化,调用 n 次缺省构造函数 delete pc; delete pc1; delete pc2; 申请堆空间之后构造函数运行; 释放堆空间之前析构函数运行; 再次强调:由堆区创建对象数组,只能调用缺省的构造函数,不能调用其他任何构造函数。如果没有缺省的构造函数,则不能创建对象数

5、组。 -下面我们再来看一下指针数组和数组指针 如果你想了解指针最好理解以下的公式 : (1)int*ptr;/指针所指向的类型是 int (2)char*ptr;/指针所指向的的类型是 char (3)int*ptr;/指针所指向的的类型是 int* (也就是一个 int * 型指针)(4)int(*ptr)3;/指针所指向的的类型是 int()3 /二维指针的声明 ()指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。 比如 int * a10;它里边放了个 int * 型变量,由于它是一个数组,已经在栈区分配了个(int * )的空间,也就是位机上是个 byte,每

6、个空间都可以存放一个 int 型变量的地址,这个时候你可以为这个数组的每一个元素初始化,在,或者单独做 个循环去初始化它。 例子: int * a2= new int(3),new int(4) ; /在栈区里声明一个 int * 数组,它的每一个元素都在堆区里申请了一个无名变量,并初始化他们为和,注意此种声明方式具有缺陷,VC 下会报错 例如: int * a2=new int3,new int3; delete a0; delet a10; 但是我不建议达内的学生这么写,可能会造成歧义,不是好的风格,并且在 VC中会报错,应该写成如下: int * a2; a0= new int3; a1

7、=new int3; delete a0; delet a10; 这样申请内存的风格感觉比较符合大家的习惯;由于是数组,所以就不可以delete a;编译会出警告.delete a1; 注意这里 是一个数组,不能 delete ; ( ) 数组指针: 一个指向一维或者多维数组的指针; int * b=new int10;指向一维数组的指针 b ; 注意,这个时候释放空间一定要 delete ,否则会造成内存泄露, b 就成为了空悬指针. int (*b2)10=new int1010; 注意,这里的 b2 指向了一个二维 int 型数组的首地址. 注意:在这里,b2 等效于二维数组名,但没有指

8、出其边界,即最高维的元素数量,但是它的最低维数的元素数量必须要指定!就像指向字符的指针,即等效一个字符串,不要把指向字符的指针说成指向字符串的指针。这与数组的嵌套定义相一致。 int(*b3) 30 20; /三级指针指向三维数组的指针; int (*b2) 20; /二级指针; b3=new int 1 20 30; b2=new int 30 20; 两个数组都是由 600 个整数组成,前者是只有一个元素的三维数组,每个元素为 30 行 20 列的二维数组,而另一个是有 30 个元素的二维数组,每个元素为20 个元素的一维数组。 删除这两个动态数组可用下式: delete b3; /删除(

9、释放)三维数组; delete b2; /删除(释放)二维数组; 再次重申:这里的 b2 的类型是 int (*) ,这样表示一个指向二维数组的指针。b3 表示一个指向(指向二维数组的指针)的指针,也就是三级指针. ( 3 ) 二级指针的指针 看下例 : int (*p)2=new (int(*)3)2; p0=new int22; p1=new int22; p2=new int22; delete p0; delete p1; delete p2; delete p; 注意此地方的指针类型为 int (*),碰到这种问题就把外边的2先去掉,然后回头先把 int * pnew int(*)n

10、申请出来,然后再把外边的附加上去; p 代表了一个指向二级指针的指针,在它申请空间的时候要注意指针的类型,那就是 int (*)代表二级指针,而 int (*)顾名思义就是代表指向二级指针的指针了。既然是指针要在堆里申请空间,那首先要定义它的范围:(int(*)n)2,n 个这样的二级指针,其中的每一个二级指针的最低维是个元素.(因为要确定一个二级指针的话,它的最低维数是必须指定的,上边已经提到)。然后我们又分别 为 p0,p1,p2在堆里分配了空间,尤其要注意的是:在释放内存的时候一定要为 p0,p1,p2,单独 delete ,否则又会造成内存泄露,在 deletep 的时候一定先 del

11、ete p0; delete p1,然后再把给p 申请的空间释放掉 delete p 这样会防止内存泄露。 ()指针的指针; int * cc=new (int*)10; 声明一个个元素的数组,数组每个元素都是一个 int *指针,每个元素还可以单独申请空间,因为 cc 的类型是 int*型的指针,所以你要在堆里申请的话就要用 int *来申请; 看下边的例子 ( & GNU 编译器都已经通过); int * a= new int * 2;/申请两个 int * 型的空间 a1=new int3;/为 a 的第二个元素又申请了个 int 型空间,a1指向了此空间首地址处 a0=new int4

12、;/为 a 的第一个元素又申请了个 int 型空间,a0 指向了此空间的首地址处 int * b; a00=0; a01=1; b=a0; delete a0/一定要先释放 a0,a1的空间,否则会造成内存泄露.; delete a1; delete a; b+; cout /GNU 编译器 g+ 实现 using namespace std; /* /vc 的实现 #include stdafx.h #include */ #define DF(F) int F() cout里的 int (*(*f4()10();的声明,f4 是一个返回指针的函数,该指针指向了含有10 个函数指针的数组,这些函数返回整形值;不是这个函数有特别之处,而是Bruce Eckel 说的“从右到左的辨认规则”是一种很好的方法,值得我们去学习,感谢他:) 最后我想应该跟大家说一下,写程序应该就象 JERRY 所说的:简单就是美;我们应该遵循一个原则 : KISS (Keep It Simple,Stupid ,尽量保持程序简单 出自 :Practical C programming),把自己的程序尽量的简单明了,这是个非常非常好的习惯。 由于写的匆忙,可能其中有遗漏的地方,大家发现希望能指正:) GOOD LUCK !

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号