c++数组字符串指针.ppt

上传人:hyn****60 文档编号:70308088 上传时间:2023-01-19 格式:PPT 页数:87 大小:1.23MB
返回 下载 相关 举报
c++数组字符串指针.ppt_第1页
第1页 / 共87页
c++数组字符串指针.ppt_第2页
第2页 / 共87页
点击查看更多>>
资源描述

《c++数组字符串指针.ppt》由会员分享,可在线阅读,更多相关《c++数组字符串指针.ppt(87页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、目录8.1 数组8.2 字符串8.3 指针8.4 小结1数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。28.1 数组8.1.1 数组的声明与使用数组的声明38.1 数组类型说明符 数组名 常量表达式 常量表达式 ;数组名的构成方法与一般变量名相同。例如:int a10;表示a为整型数组,有10个元素:a0.a9例如:int a53;表示a为整型二维数组,其中第一维有5个下标(04),第二维有3个下标(02),数组的元素个数为15,可以用于存放5行3列的整型数据表格。8.1.1 数组的声明与使用(续)引用必须先声明,后使用。只能逐个

2、引用数组元素,而不能一次引用整个数组例如:a0=a5+a7-a2*3例如:b12=a23/248.1 数组58.1 数组 8.1.1 数组的声明与使用例8-1(教材例6-1)#includeusingnamespacestd;intmain()inta10,b10;for(inti=0;i10;i+)ai=i*2-1;b10-i-1=ai;for(inti=0;i10;i+)coutai=ai;coutbI=biendl;return0;68.1 数组8.1.2 数组的存储与初始化一维数组的存储数组元素在内存中顺次存放,它们的地址是连续的。例如:a0a1a2a3a4a5a6a7a8a9a数组名

3、字是数组首元素的内存地址。数组名是一个常量,不能被赋值。78.1 数组8.1.2 数组的存储与初始化(续)一维数组的初始化可以在定义数组的同时赋给初值:在声明数组时对数组元素赋以初值。例如:static int a10=0,1,2,3,4,5,6,7,8,9;可以只给一部分元素赋初值。例如:static int a10=0,1,2,3,4;在对全部数组元素赋初值时,可以不指定数组长度。例如:static int a=0,1,2,3,4,5,6,7,8,988.1 数组8.1.2 数组的存储与初始化(续)二维数组的存储按行存放例如:float a34;其中数组a的存储顺序为:a0a00 a01

4、a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解为:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a2398.1 数组8.1.2 数组的存储与初始化(续)二维数组的初始化将所有数据写在一个内,按顺序赋值例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;分行给二维数组赋初值例如:static int a34 =1,2,3,4,5,6,7,8,9,10,11,12;可以对部分元素赋初值例如:static int a34=1,0,6,0,0,11;108.1 数组 8.1.3

5、 数组的应用举例例8-2 求Fibonacci数列前20项#includeusingnamespacestd;intmain()intf20=1,1;/初始化第0、1个数for(inti=2;i20;i+)/求第219个数fi=fi-2+fi-1;for(i=0;i20;i+)/输出,每行5个数if(i%5=0)coutendl;cout.width(12);/设置输出宽度为12coutfi;return0;118.1 数组 8.1.3 数组的应用举例例8-2(续)运行结果:运行结果:1 11 12 23 35 58 81313212134345555898914414423323337737

6、761061098798715971597258425844181418167656765例8-3 一维数组应用举例循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止。每组连续输入5个答案,每个答案可以是a.d。128.1 数组 8.1.3 数组的应用举例例8-3(续)#includeusingnamespacestd;intmain()constcharKEY=a,c,b,a,d;constintNUM_QUES=5;charc;intques=0,numCorrect=0;coutEntertheNUM_QUESquestiontests:endl;whi

7、le(cin.get(c)if(c!=n)if(c=keyques)numCorrect+;cout;elsecout*;ques+;elsecoutScorestatic_cast(numCorrect)/NUM_QUES*100%;ques=0;numCorrect=0;coutendl;return0;138.1 数组 8.1.3 数组的应用举例148.1 数组 8.1.3 数组的应用举例例8-3(续)运行结果:acbba*Score60%acbadScore100%abbda*Score40%bdcba*Score0%158.1 数组8.1.4 以数组作为函数参数数组元素作实参,与单个

8、变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。例8-4(教材例6-2)使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。168.1 数组 8.1.4 以数组作为函数参数#includeusingnamespacestd;voidrowSum(inta4,intnRow)for(inti=0;inRow;i+)for(intj=1;j4;j+)ai0+=aij;intmain()/主函数inttable3

9、4=1,2,3,4,2,3,4,5,3,4,5,6;/声明并初始化数组17例8-4(续)8.1 数组 8.1.4 以数组作为函数参数/输出数组元素for(inti=0;i3;i+)for(intj=0;j4;j+)couttableij;coutendl;rowSum(table,3);/调用子函数,计算各行和/输出计算结果for(inti=0;i3;i+)coutSumofrowiistablei0endl;return0;18例8-4(续)8.1 数组 8.1.4 以数组作为函数参数19例8-4(续)运行结果:123423453456Sumofrow0is10Sumofrow1is14Su

10、mofrow2is188.1 数组 8.1.4 数组作为函数参数208.1 数组8.1.5 对象数组声明:类名 数组名元素个数;访问方法:通过下标访问 数组名下标.成员名21对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Point a2=Point(1,2),Point(3,4);如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用缺省构造函数)。8.1 数组 8.1.5 对象数组22数组元素所属类的构造函数不声明构造函数,则采用缺省构造函数。各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的

11、初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。8.1 数组 8.1.4 对象数组23例8-5(教材例6-4)对象数组应用举例/Point.h#ifndef_POINT_H#define_POINT_HclassPoint/类的定义public:/外部接口Point();Point(intx,inty);Point();voidmove(intnewX,intnewY);intgetX()constreturnx;intgetY()constreturny;staticvoidshowCount();/静态函数成员private:/私有数据

12、成员intx,y;#endif/_POINT_H8.1 数组 8.1.4 对象数组24例8-5(续)/Point.cpp#include#includePoint.husingnamespacestd;Point:Point()x=y=0;coutDefaultConstructorcalled.endl;Point:Point(intx,inty):x(x),y(y)coutConstructorcalled.endl;Point:Point()coutDestructorcalled.endl;voidPoint:move(intnewX,intnewY)coutMovingthepoin

13、tto(newX,newY)endl;x=newX;y=newY;8.1 数组 8.1.4 对象数组25例8-5(续)/6-3.cpp#includePoint.h#includeusingnamespacestd;intmain()coutEnteringmain.endl;Pointa2;for(inti=0;i2;i+)ai.move(i+10,i+20);coutExitingmain.endl;return0;8.1 数组 8.1.4 对象数组26例8-5(续)运行结果:Enteringmain.DefaultConstructorcalled.DefaultConstructorc

14、alled.Movingthepointto(10,20)Movingthepointto(11,21)Exitingmain.Destructorcalled.Destructorcalled.8.1 数组 8.1.4 对象数组278.2 字符串8.2.1 用字符数组存储和处理字符串字符串常量(例:program)各字符连续、顺序存放,每个字符占一个字节,以0结尾,相当于一个隐含创建的字符常量数组“program”出现在表达式中,表示这一char数组的首地址首地址可以赋给char常量指针:const char*STRING1=program;字符串变量可以显式创建字符数组来表示字符串变量,例

15、如,以下三条语句具有等价的作用:char str8=p,r,o,g,r,a,m,0;char str8=program;char str=program;p pr ro og gr ra am m00288.2 字符串 8.2.1 用字符数组存储和处理字符串用字符数组表示字符串的缺点用字符数组表示字符串的缺点执行连接、拷贝、比较等操作,都需要显式调用库函数,很麻烦当字符串长度很不确定时,需要用new动态创建字符数组,最后要用delete释放,很繁琐字符串实际长度大于为它分配的空间时,会产生数组下标越界的错误解决方法使用字符串类string表示字符串string实际上是对字符数组操作的封装298

16、.2 字符串8.2.2 string类常用构造函数string();/缺省构造函数,建立一个长度为0的串string(const char*s);/用指针s所指向的字符串常量初始化string类的对象string(const string&rhs);/拷贝构造函数例:string s1;/建立一个空字符串string s2=“abc”;/用常量建立一个初值为”abc”的字符串string s3=s2;/执行拷贝构造函数,用s2的值作为s3的初值308.2 字符串8.2.2 string类(续)常用操作符s+t将串s和t连接成一个新串s=t用t更新ss=t判断s与t是否相等s!=t判断s与t是否

17、不等s t判断s是否小于t(按字典顺序比较)s t判断s是否大于t(按字典顺序比较)s=t判断s是否大于或等于t(按字典顺序比较)si访问串中下标为i的字符例:string s1=abc,s2=def;string s3=s1+s2;/结果是abcdefbool s4=(s1 s2);/结果是truechar s5=s21;/结果是e例8-6(教材例6-23)string类应用举例31#include#includeusingnamespacestd;/根据value的值输出true或false,title为提示文字inlinevoidtest(constchar*title,boolvalu

18、e)couttitlereturns(value?true:false)endl;8.2 字符串 8.2.2 string类例8-6(续)32intmain()strings1=DEF;couts1iss1endl;strings2;couts2;coutlengthofs2:s2.length()endl;/比较运算符的测试test(s1=ABC,s1=ABC);test(DEF=s1,DEF=s1);/连接运算符的测试s2+=s1;couts2=s2+s1:s2endl;coutlengthofs2:s2.length()操作符输入字符串,会以空格作为分隔符,空格后的内容会在下一回输入时被

19、读取用string头文件中的getline可以输入整行字符串,例如:getline(cin,s2);以其它字符作为分隔符输入字符串输入字符串时,可以使用其它分隔符作为字符串结束的标志(例如逗号、分号)把分隔符作为getline的第3个参数即可,例如:getline(cin,s2,);8.2 字符串 8.2.2 string类例8-7(教材例6-24)用getline输入字符串34include#includeusingnamespacestd;intmain()for(inti=0;i2;i+)stringcity,state;getline(cin,city,);getline(cin,st

20、ate);coutCity:city“State:stateendl;return0;8.2 字符串 8.2.2 string类运行结果:Beijing,ChinaCity:Beijing State:ChinaSan Francisco,the United StatesCity:San Francisco State:the United States8.3.1 内存空间的访问方式内存空间的访问方式通过变量名访问通过地址访问358.3 指针8.3.2 指针变量的声明概念指针:指针:内存地址,用于间接访问内存单元指针指针变量变量:用于存放地址的变量声明例:static int i;stati

21、c int*ptr=&i;引用例1:i=3;例2:*ptr=3;368.3 指针指向整型变量的指针20003ptr*ptri2000内存用户数据区变量 i变量 j变量 ptr3620002000200430108.3.3 与地址相关的运算“*”和“&”地址运算符:&例:int var;则&var 表示变量 var 在内存中的起始地址378.3 指针8.3.4 指针的赋值指针变量的初始化语法形式存储类型 数据类型*指针名初始地址;例:int*pa=&a;注意事项用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一个指针变量。不

22、要用一个内部 auto 变量去初始化 static 指针。388.3 指针指针变量的赋值运算指针指针名名=地址地址“地址”中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。例:void*general;398.3 指针 8.3.4 指针的赋值例8-8(教材例6-5)指针的声明、赋值与使用#includeusingnamespac

23、estd;intmain()inti;/定义int型数iint*ptr=&i;/取i的地址赋给ptri=10;/int型数赋初值couti=iendl;/输出int型数的值cout*ptr=*ptrendl;/输出int型指针所指地址的内容return0;408.3 指针 8.3.4 指针的赋值运行结果:i=10*ptr=10例8-9(教材例6-6)void类型指针的使用#includeusingnamespacestd;intmain()/!voidvoidObject;错,不能声明void类型的变量void*pv;/对,可以声明void类型的指针inti=5;pv=&i;/void类型指针

24、指向整型变量int*pint=static_cast(pv);/void类型指针赋值给int类型指针cout*pint=*pintendl;return0;418.3 指针 8.3.4 指针的赋值指向常量的指针不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。例:int a;const int*p1=&a;/p1是指向常量的指针int b;p1=&b;/正确,p1本身的值可以改变*p1=1;/编译时出错,不能通过p1改变所指的对象428.3 指针 8.3.4 指针的赋值指针类型的常量若声明指针常量,则指针本身的值不能被改变。例:int a;int*const p2=&a;

25、p2=&b;/错误,p2是指针常量,值不能改变438.3 指针 8.3.4 指针的赋值8.3.5 指针运算指针变量的算术运算指针变量的关系运算448.3 指针指针变量的算术运算指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。p1n1等价于*(p1+n1)指针加一,减一运算指向下一个或前一个数据。例如:y=*px+相当于 y=*(px+)(*和+优先级相同,自右向左运算)458.3 指针 8.3.5 指针运算papa-2pa-1pa+1pa+2pa+3*(pa-2)或pa-2*pa或pa0*(pa+1)或pa

26、1*(pa+2)或pa2*(pa+3)或pa3*(pa-1)或pa-1short*pa468.3 指针 8.3.5 指针运算pb-1pbpb+1pb+2*(pb-1)或pb-1*pb或pb0*(pb+1)或pb1*(pb+2)或pb2long*pb478.3 指针 8.3.5 指针运算指针变量的关系运算关系运算指向相同类型数据的指针之间可以进行各种关系运算。指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0赋值运算向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。488.

27、3 指针 8.3.5 指针运算8.3.6 用指针处理数组元素声明与赋值例:int a10,*pa;pa=&a0;或 pa=a;通过指针引用数组元素经过上述声明及赋值后:*pa就是a0,*(pa+1)就是a1,.,*(pa+i)就是ai.ai,*(pa+i),*(a+i),pai都是等效的。不能写 a+,因为a是数组首地址是常量。498.3 指针例8-10(教材例6-7)506.2 指针 6.2.6 用指针处理数组元素设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标使用数组名和指针运算使用指针变量例8-10(续)使用数组名和下标516.2 指针 6.2.6 用指针处理

28、数组元素#includeusingnamespacestd;intmain()inta10=1,2,3,4,5,6,7,8,9,0;for(inti=0;i10;i+)coutai;coutendl;return0;例8-10(续)使用数组名指针运算526.2 指针 6.2.6 用指针处理数组元素#includeusingnamespacestd;intmain()inta10=1,2,3,4,5,6,7,8,9,0;for(inti=0;i10;i+)cout*(a+i);coutendl;return0;例8-10(续)使用指针变量536.2 指针 6.2.6 用指针处理数组元素#incl

29、udeusingnamespacestd;intmain()inta10=1,2,3,4,5,6,7,8,9,0;for(int*p=a;p(a+10);p+)cout*p;coutendl;return0;8.3.7 指针数组数组的元素是指针型例:Point *pa2;由pa0,pa1两个指针组成 548.3 指针例8-11(教材例6-8)利用指针数组存放单位矩阵558.3 指针 8.3.7 指针数组#includeusingnamespacestd;intmain()intline1=1,0,0;/矩阵的第一行intline2=0,1,0;/矩阵的第二行intline3=0,0,1;/矩阵

30、的第三行/定义整型指针数组并初始化int*pLine3=line1,line2,line3;例8-11(续)568.3 指针 8.3.7 指针数组coutMatrixtest:endl;/输出单位矩阵for(inti=0;i3;i+)for(intj=0;j3;j+)coutpLineij;coutendl;return0;输出结果为:Matrixtest:1,0,00,1,00,0,1例8-12(教材例6-9)二维数组举例578.3 指针 8.3.7 指针数组#includeusingnamespacestd;intmain()intarray233=11,12,13,21,22,23,31

31、,32,33;for(inti=0;i3;i+)for(intj=0;j3;j+)cout*(*(array2+i)+j);/逐个输出二维数组第i行元素值coutendl;return0;58例8-12(续)运行结果:1112132122233132338.3 指针 8.3.7 指针数组59指针数组 vs 二维数组8.3 指针 8.3.7 指针数组pLine0 pLine1 pLine2(a)指针数组array20array21array22array2二维数组pLine8.3.8 用指针作为函数参数以地址方式传递数据,可以用来返回函数处理结果。实参是数组名时形参可以是指针。608.3 指针例

32、8-13(教材例6-10)618.3 指针 8.3.8 用指针作为函数参数题目:读入三个浮点数,将整数部分和小数部分分别输出#includeusingnamespacestd;voidsplitFloat(floatx,int*intPart,float*fracPart)/取x的整数部分*intPart=static_cast(x);/取x的小数部分*fracPart=x-*intPart;例8-13(续)628.3 指针 8.3.8 用指针作为函数参数intmain()coutEnter3floatpointnumbers:endl;for(inti=0;ix;splitFloat(x,&

33、n,&f);/变量地址作为实参coutIntegerPart=nFractionPart=fendl;return0;63例8-13(续)运行结果:Enter3floatingpointnumbers4.7IntegerPart=4FractionPart=0.78.913IntegerPart=8FractionPart=0.913-4.7518IntegerPart=-4FractionPart=-0.75188.3 指针 8.3.8 用指针作为函数参数例8-14 输出数组元素的内容和地址648.3 指针 8.3.8 用指针作为函数参数#include#includeusingnamesp

34、acestd;voidarrayPtr(long*p,intn)coutInfunc,addressofarrayispendl;coutAccessingarrayusingpointersendl;for(inti=0;in;i+)coutAddressforindexiisp+i;coutValueis*(p+i)endl;例8-14(续)658.3 指针 8.3.8 用指针作为函数参数intmain()longlist5=50,60,70,80,90;coutInmain,addressofarrayislistendl;coutendl;arrayPtr(list,5);return

35、0;66例8-14(续)运行结果:Inmain,addressofarrayis0012FF50Infunc,addressofarrayis0012FF50AccessingarrayusingpointersAddressforindex0is0012FF50Valueis50Addressforindex1is0012FF54Valueis60Addressforindex2is0012FF58Valueis70Addressforindex3is0012FF5CValueis80Addressforindex4is0012FF60Valueis908.3 指针 8.3.8 用指针作为函

36、数参数例8-15 指向常量的指针做形参678.3 指针 8.3.8 用指针作为函数参数#includeusingnamespacestd;constintN=6;voidprint(constint*p,intn);intmain()intarrayN;for(inti=0;iarrayi;print(array,N);return0;voidprint(constint*p,intn)cout*p;for(inti=1;in;i+)cout,*(p+i);coutendl;8.3.9 指针型函数当函数的返回值是地址时,该函数就是指针形函数。声明形式存储类型 数据类型 *函数名()688.3

37、指针8.3.10 指向函数的指针声明形式存储类型 数据类型 (*函数指针名)();含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。698.3 指针例8-16(教材例6-11)函数指针708.3 指针 8.3.10 指向函数的指针#includeusingnamespacestd;voidprintStuff(float)coutThisistheprintstufffunction.endl;voidprintMessage(floatdata)coutThedatatobelistedisdataendl;voidprintFloat(floatdata)coutThedat

38、atobeprintedisdata成员名ptr-getx()相当于(*ptr).getx();738.3 指针例8-17(教材例6-12)使用指针来访问Point类的成员/6_12.cpp#includeusingnamespacestd;classPoint/类的定义public:/外部接口Point(intx=0,inty=0):x(x),y(y)/构造函数intgetX()constreturnx;/返回xintgetY()constreturny;/返回yprivate:/私有数据intx,y;748.3 指针 8.3.11 对象指针的一般概念例8-17(续)75intmain()/主函数Pointa(4,5);/定义并初始化对象aPoint*p1=&a;/定义对象指针,用a的地址将其初始化coutgetX()endl;/利用指针访问对象成员couta.getX()x;778.3 指针 8.3.11 对象指针小结878.4 小结主要内容数组、字符串、指针达到的目标理解数组、指针的概念,掌握定义和使用方法,会使用string类。

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com