C++学习2011-3-12指针动态内存5章节

上传人:E**** 文档编号:91277992 上传时间:2019-06-27 格式:PPT 页数:26 大小:139.50KB
返回 下载 相关 举报
C++学习2011-3-12指针动态内存5章节_第1页
第1页 / 共26页
C++学习2011-3-12指针动态内存5章节_第2页
第2页 / 共26页
C++学习2011-3-12指针动态内存5章节_第3页
第3页 / 共26页
C++学习2011-3-12指针动态内存5章节_第4页
第4页 / 共26页
C++学习2011-3-12指针动态内存5章节_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《C++学习2011-3-12指针动态内存5章节》由会员分享,可在线阅读,更多相关《C++学习2011-3-12指针动态内存5章节(26页珍藏版)》请在金锄头文库上搜索。

1、1,6.3 指针与动态内存分配,6.3.1 动态分配运算符 介绍动态分配运算符new和delete。new和delete的使用,也是C+语言优于C语言的特征之一。 New运算是程序中除了变量说明之外,又一种生成变量的方法,不过用new生成的变量为无名动态变量,它返回的是一个该类型的指针值,程序通过指针对这个变量进行操作。,2,6.5 指针与内存动态分配 - 参看书p148的6.3节,通过使用new与delete单目运算符来实现动态变量的分配与撤消。 new功能: 生成一个(或一批)所给类型的无名动态变量,返回所生成变量的一个指针值(首地址)。 delete功能: 释放通过new生成的动态变量(

2、或动态数组),但指针变量仍存在。,3,C程序中的变量,除了通过变量说明创建,用变量名引用的形式之外,还有一种特别的形式,即通过动态的内存分配运算符new和delete,来实现通过指针引用的另一种形式,生成变量。例如: int *pint; char *pchar; float *pfloat; pfloat=new float; pchar=new char; pint=new int; 这样就生成了三个(浮点型、字符型、整型)变量,但它们没有名字。由于三个变量的地址分别存在指针pfloat,pchar和pint,故在程序中使用这三个变量时,全通过指针:,4,*pchar=A; *pint=5

3、; *pfloat=4.7; *pint+; 当不再需要这些变量时,可在程序的任何地点释放掉它们: delete pchar; delete pint; delete pfloat; 注意,这里释放的是动态的(字符)变量,而不是指针变量(pchar)。 这种动态生成的变量,在使用上方便灵活,其必要条件就是应用相应的指针来操纵它。,5,6.5 指针与内存动态分配 - 参看书p148的6.3节,通过使用new与delete单目运算符来实现动态变量的分配与撤消。 1) new 使用格式: new /生成指定类型的一个动态变量 new ( ) /生成指定类型的一个动态变量,并赋初值 new /生成指定

4、类型的一批动态变量(形成一个动态数组),功能: 生成一个(或一批)所给类型的无名动态变量,返回所生成变量的一个指针值(首地址)。,6,例:,int *pi, *pj, a=10; char *pc; pi = new int; /生成一动态int变量 *pi = a*a; /对动态变量*pi的使用 pc = new char(A); /生成动态变量*pc,并赋初值A pj = new int10; /生成一个动态数组,具有10个int 型分量,数组首地址赋给pj,7,int *pi,a=5; char *pc; float *pf,f=3.0; pi=new int; /生成一动态int变量

5、pc=new chard;/生成动态char型数组 pf=new float(4.7); /生成动态float型变量且赋初值 *pia*a; /动态变量*pi被赋值 for(int i=0;i4;i) *(pci)a; /动态char型数组的每个分量被赋值 f+=*pi; /动态变量*pf参加运算,8,有哪些错误?,#include void main( ) int *pi,a=5; char *pc; float *pf,f=3.0; pi=new int; /生成一动态int变量 pc=new chara; /生成动态char型数组 pf=new float(4.7); /生成动态floa

6、t型变量且赋初值 *pi=a*a; /动态变量*pi被赋值 for(int i=0;i4;i+) *(pc+i)=a; /动态char型数组的每个分量被赋值 f+=*pf; /动态变量*pf参加运算 cout“pi: “*piendl; cout“pc: “pcendl; cout“pf: “*pf“f: “fendl; ,*(pc+i)=0;,9,我们可以把用new生成一个动态变量与用变量说明语句说明一个变量作比较: 都要指出变量的类型,类型名要放在new之后。 都可以赋初值,不是用=初值的方式而是用括号(初值)的方式。 都可以说明为数组,加数组运算符 。 动态变量没有变量名,须用指针变量接

7、收到它的地址后,通过指针运算符*进行操作。,10,a=new int*3; /a为指针,指向具有3个int*数据的数组(即元素均为指针的数组) for(i=0;i3;i+) *(a+i)=new int4; /*分配3批动态空间(每批为4个int大小),并使上述数组元素指针指向它们。此时的a实际上是一个3行4列的数组,也可通过aij的形式访问各元素。*/,11,2) delete 使用格式: delete delete delete /释放通过new生成的动态变量, 但指针变量仍存在 delete /释放通过new生成的动态数组 功能: 释放通过new生成的动态变量(或动态数组),但指针变量仍

8、存在。,12,Delete运算用来撤消或释放由new生成的动态变量,例如: delete pa;/释放pa指向的动态int变量 delete pf;/释放pf指向的动态float变量 delete pc; /释放pc指向的动态数组 动态变量与一般变量的主要区别就是它可以在程序运行过程中任意被撤销。而一般变量则必须在其所说明的程序块结果时自动撤销。,13,3) 使用示例,从键盘输入10个int型数,而后按输入的相反顺序输出它们。要求使用new运算符动态申请数据空间存放数据。 使程序执行后的输入输出界面为: Input 10 integers: 1 2 3 4 5 6 7 8 9 10 - The

9、 result - 10 9 8 7 6 5 4 3 2 1,14,#include void main() int i, *a, *p; a = new int10; cout*(a+i); /也可用ai cout=a; p-) cout*p“ “; coutendl; ,15,带详细注解的程序(段)如下:,#include void main() int i, *a, *p; /说明指针变量a及指针变量p a=new int10; /使用new运算符动态申请可存放10个int数据 /的a数组空间(用于存放数据) cout“input 10 integers:“endl; /提示用户输入10

10、个整数,16,for(i=0; i*(a+i); /*(a+i)全同于ai cout=a; p-) /循环过程中p值总在变化(通过指针加减运算), /p=a为指针比较运算 cout*p“ “; /输出各*p,也即各不同的ai coutendl; ,17,#include void main() int lin,col,i,j; coutlincol; int*b; b=new int*lin; for(i=0;ilin;i+) bi=new intcol; for(i=0;ilin;i+) for(j=0;jcol;j+) bij=i+j; for(i=0;ilin;i+) for(j=0;j

11、col;j+) coutbij“ “; coutendl; ,18,多重指针(指向指针的指针) 读下面的程序,给出它执行后所显示的结果(利用指针实现动态数组功能)。 #include void main() int lin,col,i,j; coutlincol; /任意输入行数lin及列数col int*b; b = new int*lin; /lin(行数)个“int*”指针 for(i=0;ilin;i+) bi = new intcol; /每行有col(列数)个int数 /此时的b成为动态(大小)的二维数组,18,for(i=0;ilin;i+) for(j=0;jcol;j+) b

12、ij=i+j;/可按下标方式使用各数组元素,给b数组赋值 for(i=0;ilin;i+) /按lin行col列格式显示出b数组各元素 for(j=0;jcol;j+) coutbij“ “; coutendl; ,19,19,for(i=0;ilin;i+) for(j=0;jcol;j+) bij=i+j;/可按下标方式使用各数组元素,给b数组赋值 for(i=0;ilin;i+) /按lin行col列格式显示出b数组各元素 for(j=0;jcol;j+) coutbij“ “; coutendl; cout*(*b+2)endl; cout*b+2endl; cout*(b+2)end

13、l; ,20,end,21,4. 指针与数组使用示例,读下面的程序,给出它执行后所显示的结果。 程序执行后的显示结果如下: x=123 *p=123 *q=123 lin,col=4 5 0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 11 12 13 14 21 22 23 24,22,#include void main() int x,*p,*q; /q为指向指针的指针(变量) x=123; p=,23,cinlincol; /任意输入行数lin及列数col int*b; /通过下面的2个语句, 可使b成为动态(大小)的2维数组 b=new int*lin

14、; /lin(行数)个int*指针 for(i=0;ilin;i+) bi=new intcol; /每行有col(列数)个int数,24,for(i=0;ilin;i+) for(j=0;jcol;j+) bij=i+j; /可按下标方式使用各数组元素,给b数组赋值 for(i=0;ilin;i+) /按lin行col列格式显示出b数组各元素 for(j=0;jcol;j+) coutbij“ “; coutendl; ,25,coutendl; int (*pa)4; /pa为指针,指向一维数组,数组含4个int型分量 int A34= 11,12,13,14, 21,22,23,24, 31,32,33,34 ; pa=A; /pa指向A数组的第一行 cout(*pa)0“ “(*pa)1“ “(*pa)2“ “(*pa)3endl; /输出A数组第一行: 11 12 13 14,26,pa+; /一步向后“迈过“pa所指向的那一个一维数组的整体大小 /使pa指向A数组的第二行 cout(*pa)0“ “(*pa)1“ “(*pa)2“ “(*pa)3endl; /输出A数组第二行: 21 22 23 24 ,

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

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

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