数组、指针与字符串.ppt_第1页
数组、指针与字符串.ppt_第2页
数组、指针与字符串.ppt_第3页
数组、指针与字符串.ppt_第4页
数组、指针与字符串.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章数组、指针与字符串,C+语言程序设计,2,本章主要内容,数组指针动态存储分配深拷贝与浅拷贝字符串,3,数组的概念,数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。,数组,4,数组的几点说明,数组的定义形式同C语言中的数组。数组名是常量,表示数组元素的首地址。数组下标从零开始。下标必须是整形表达式。数组元素可以在定义时直接给出初始值列表。数组元素作函数参数同简单变量作函数参数。数组名作函数参数传递的是地址值。二维数组在内存中按行存放。,数组,5,对象数组,声明:类名数组名元素个数;访问方法:数组名下标.成员名,数组,6,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。PointA2=Point(1,2),Point(3,4);如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数或带默认形参值的构造函数)。PointA2=Point(1,2);,数组,7,数组元素所属类的构造函数,各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。,数组,8,数组,#includeusingnamespacestd;classPointpublic:Point();Point();Point:Point()coutDefaultConstructorcalled.endl;Point:Point()coutDestructorcalled.endl;voidmain()PointA2;,P163例6-3,9,声明例:inti;int*i_pointer;,概念指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量,引用i_pointer=,指针,指针变量的概念,10,语法形式存储类型数据类型*指针名初始地址;例:inta,*pa=注意事项用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一个指针变量。不要用一个内部auto变量去初始化static指针。,指针,指针变量的初始化,11,指针名=地址向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsignedlongint型。允许声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。但是不能通过void类型的指针间接访问所指向的变量,必须经过强制类型转换。,指针,指针变量的赋值,12,例6-6void类型指针的使用,#includeusingnamespacestd;/voidvobject;/错,不能声明void类型的变量void*pv;/对,可以声明void类型的指针int*pint;inti;voidmain()couti=iendl;pv=,指针,cout*pv=*(int*)pvendl;,13,指针变量的算术运算,指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。指针自增,自减运算指向下一个或前一个数据。例如:y=*px+相当于y=*(px+)(*和+优先级相同,自右向左运算),指针,short*pa,14,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),long*pb,15,16,关系运算指向相同类型数据的指针之间可以进行=与!=的关系运算。指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0,指针变量的关系运算,指针,17,指向数组元素的指针,声明与赋值例:inta10,*pa;pa=通过指针引用数组元素经过上述声明及赋值后:*pa就是a0,*(pa+i)就是ai.ai,*(pa+i),*(a+i),pai都是等效的。不能写a+,因为a是数组首地址(是常量)。,指针,18,指针数组,数组的元素是指针类型例:Point*pa2;由pa0,pa1两个指针组成,指针,19,例6-8利用指针数组存放单位矩阵,#includeusingnamespacestd;voidmain()intline1=1,0,0;/声明数组,矩阵的第一行intline2=0,1,0;/声明数组,矩阵的第二行intline3=0,0,1;/声明数组,矩阵的第三行int*p_line3;/声明整型指针数组p_line0=line1;/初始化指针数组元素p_line1=line2;p_line2=line3;,指针,/输出单位矩阵coutMatrixtest:endl;for(inti=0;i3;i+)for(intj=0;j3;j+)cout;coutendl;,输出结果为:Matrixtest:100010001,20,指针,也可以写成:p_lineij或*(*(p_line+i)+j),*(p_linei+j),21,例6-9二维数组举例,#includeusingnamespacestd;voidmain()inta23=11,12,13,21,22,23;int(*p1)3=a;for(inti=0;i2;i+)for(intj=0;j3;j+)cout*(*(p1+i)+j);coutendl;,指针,可以写成:*(p1i+j)或p1ij,22,例6-9二维数组举例,#includeusingnamespacestd;voidmain()inta23=11,12,13,21,22,23;int*p1=a;for(inti=0;i2;i+)for(intj=0;j3;j+)cout*p1+;coutx;splitfloat(x,25,指针与函数,运行结果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.7518,26,指针与函数,27,例:输出数组元素的内容和地址,#include#includeusingnamespacestd;voidArray_Ptr(long*P,intn)inti;coutInfunc,addressofarrayisunsignedlong(P)endl;coutAccessingarrayusingpointersendl;for(i=0;in;i+)coutAddressforindexiisunsignedlong(P+i);coutValueis*(P+i)endl;,指针与函数,voidmain()longlist5=50,60,70,80,90;coutInmain,addressofarrayisunsignedlong(list)endl;coutendl;Array_Ptr(list,5);,28,运行结果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis90,29,30,指针型函数,当函数的返回值是地址时,该函数就是指针型函数。定义形式:返回值类型*函数名(参数表)函数体,指针与函数,31,指针型函数,#includeusingnamespacestd;char*ch(chars)inti;for(i=0;si!=0;i+)if(si=A)break;returns+i;voidmain()char*s=ThbikAjiklom;coutch(s)endl;,指针与函数,32,声明形式数据类型(*函数指针名)();含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。,指向函数的指针,指针与函数,33,例6-11函数指针,#includeusingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float);voidmain()floatpi=(float)3.14159;floattwo_pi=(float)2.0*pi;,指针与函数,print_stuff(pi);function_pointer=print_stuff;function_pointer(pi);function_pointer=print_message;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(pi);,34,指针与函数,voidprint_stuff(floatdata_to_ignore)coutThisistheprintstufffunction.n;voidprint_message(floatlist_this_data)coutThedatatobelistedislist_this_dataendl;voidprint_float(floatdata_to_print)coutThedatatobeprintedisdata_to_printY=yy;,this指针,45,this指针,一般的程序设计中,通常不直接使用this指针来引用对象成员。this是一个指针变量,因此在成员函数中,可以使用*this来标识正在调用该函数的对象。,this指针,46,#includeusingnamespacestd;classPointpublic:Point(intX,intY);intGetX()returnX;intGetY()returnY;private:intX,Y;Point:Point(intX,intY)this-X=X;this-Y=Y;voidmain()Pointp(4,5);coutp.GetX()endsp.GetY()Y=Y;coutGetX()GetY();coutendl;cout(*this).GetX()ends(*this).GetY();cout*类成员指针名)(参数表),指针,53,指向类的静态成员的指针,对类的静态成员的访问不依赖于对象可以用普通的指针来指向和访问静态成员例6-14通过指针访问类的静态数据成员例6-15通过指针访问类的静态函数成员,指针,54,#includeusingnamespacestd;classPointpublic:Point(intxx=0,intyy=0)X=xx;Y=yy;countP+;Point(Point,指针,P184例6-14,voidmain()int*count=,55,指针,56,指针,P185例6-15,#includeusingnamespacestd;classPointpublic:Point(intxx=0,intyy=0)X=xx;Y=yy;countP+;Point(Point,voidmain()void(*gc)()=Point:GetC;PointA(4,5);coutPointA,A.GetX(),A.GetY();gc();PointB(A);coutPointB,B.GetX(),B.GetY();gc();,57,指针,58,动态申请内存操作符new,new类型名T(初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0(NULL),动态存储分配,59,动态申请内存操作符new,动态存储分配,int*point=newint(2);等价于:int*point;point=newint(2);注:动态分配了用于存放int类型数据的内存空间,同时在此空间中存入数值2。如果不指定初值可以写成:point=newint;或point=newint();,60,动态申请内存操作符new,动态存储分配,Line*line=newLine;表示:调用默认的构造函数。默认的构造函数不存在则调用带有默认形参值的构造函数。上述两种函数都不存在,则创建动态存储区失败。,61,释放内存操作符delete,delete指针P功能:释放指针P所指向的内存。P必须是new操作的返回值。,动态存储分配,62,#includeusingnamespacestd;classPointpublic:Point()X=Y=0;coutDefaultConstructorcalled.n;Point(intxx,intyy)X=xx;Y=yy;coutConstructorcalled.n;Point()coutDestructorcalled.n;intGetX()returnX;intGetY()returnY;voidMove(intx,inty)X=x;Y=y;private:intX,Y;,动态存储分配,动态创建对象,voidmain()coutStepOne:endl;Point*Ptr1=newPoint;deletePtr1;coutStepTwo:endl;Ptr1=newPoint(1,2);deletePtr1;,运行结果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.,63,动态存储分配,64,例6-17动态创建对象数组举例,#includeusingnamespacestd;classPoint/类的声明同上例,略;voidmain()Point*Ptr=newPoint2;/创建对象数组Ptr0.Move(5,10);Ptr1.Move(15,20);coutDeleting.endl;deletePtr;/删除整个对象数组,动态存储分配,运行结果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting.Destructorcalled.Destructorcalled.,65,动态存储分配,例6-18动态数组类P189,#includeusingnamespacestd;classPoint/类的声明同例6-16;classArrayOfPointspublic:ArrayOfPoints(intn)numberOfPoints=n;points=newPointn;ArrayOfPoints()coutDeleting.number;/创建对象数组ArrayOfPointspoints(number);/通过指针访问数组元素的成员points.Element(0).Move(5,10);/通过指针访问数组元素的成员points.Element(1).Move(15,20);,67,动态存储分配,运行结果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.Deleting.Destructorcalled.Destructorcalled.,68,动态存储分配,69,动态创建多维数组,new类型名T下标表达式1下标表达式2;如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,不是一个T类型的指针,而是一个指向T类型数组的指针,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:char(*fp)3;fp=newchar23;,动态存储分配,char(*fp)3;,fp,fp+1,70,71,例6-18动态创建多维数组,#includeusingnamespacestd;voidmain()float(*cp)98;inti,j,k;cp=newfloat898;for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k8;k+)*(*(*(cp+i)+j)+k)=i*100+j*10+k;/通过指针访问数组元素,动态存储分配,for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k8;k+)/将指针cp作为数组名使用,/通过数组名和下标访问数组元素coutcpijk;coutendl;coutendl;,72,动态存储分配,例6-18动态创建多维数组,73,动态存储分配函数,void*malloc(size);参数size:欲分配的字节数返回值:成功,则返回void型指针。失败,则返回空指针。头文件:和,动态存储分配,74,动态内存释放函数,voidfree(void*memblock);参数memblock:指针,指向需释放的内存。返回值:无头文件:和,动态存储分配,75,浅拷贝与深拷贝,浅拷贝实现对象间数据元素的一一对应复制。深拷贝当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。,浅拷贝与深拷贝,76,#includeusingnamespacestd;classCopypublic:Copy()p=newint(2);voidsetP()*p=14;intshow()return*p;private:int*p;,voidmain()Copyc1;Copyc2(c1);coutc1=c1.show()ends;coutc2=c2.show()endl;c1.setP();coutc1=c1.show()ends;coutc2=c2.show()endl;,77,#includeusingnamespacestd;classCopypublic:Copy()p=newint(2);Copy(Copy,voidmain()Copyc1;Copyc2(c1);coutc1=c1.show()ends;coutc2=c2.show()endl;c1.setP();coutc1=c1.show()ends;coutc2=c2.show()endl;,78,用字符数组存储和处理字符串,字符串,用字符数组处理字符串同C语言。charch6=c,h,i,n,a;charch6=china;charch6=china;,79,字符串的输入/输出,方法逐个字符输入输出将整个字符串一次输入或输出例:charc=China;coutstr1str2str3;运行时输入数据:Howareyou?,80,字符串,若改为:charstr13;cinstr;运行时输入数据:Howareyou?,81,字符串,82,整行输入字符串,cin.getline(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(默认为n)。读入的字符串存放于字符数组St中。读取但不存储结束符。cin.get(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(默认为n)。读入的字符串存放于字符数组St中。既不读取也不存储结束符。,字符串,83,整行输入字符串举例,#includeusingnamespacestd;voidmain(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论