数组、指针与字符串.ppt

上传人:wuy****n92 文档编号:91841402 上传时间:2023-05-28 格式:PPT 页数:42 大小:492KB
返回 下载 相关 举报
数组、指针与字符串.ppt_第1页
第1页 / 共42页
数组、指针与字符串.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《数组、指针与字符串.ppt》由会员分享,可在线阅读,更多相关《数组、指针与字符串.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+C+面向对象程序设计面向对象程序设计第四章第四章 数组、指针与字符串数组、指针与字符串陈春丽陈春丽第四章第四章 数组、指针与字符串数组、指针与字符串4.1 4.1 数组数组4.2 4.2 指针指针4.3 4.3 动态内存分配动态内存分配4.4 4.4 深拷贝与浅拷贝深拷贝与浅拷贝4.5 4.5 字符串字符串4.1 4.1 数组数组数组是具有一定顺序关系的若干相同类型变量的数组是具有一定顺序关系的若干相同类型变量的集合体,数组属于构造类型集合体,数组属于构造类型1 1)数组的长度是固定的)数组的长度是固定的2 2)数组元素在内存中顺次存放,它们的地址是连续的数组元素在内存中顺次存放,它们的地

2、址是连续的3 3)数组名是数组首元素的内存地址数组名是数组首元素的内存地址4 4)数组名是一个常量,不能被赋值数组名是一个常量,不能被赋值一维数组的声明一维数组的声明类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ;例如:例如:int a10;int a10;表示表示 整型数组整型数组a a有有1010个元素个元素a0.a9a0.a9引用引用必须先声明,后使用。只能逐个引用数组元素,而不必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组能一次引用整个数组。例如:例如:a0=a5+a7-a2*3a0=a5+a7-a2*3例例4.14.1一维数组的声明与引用一维数组的声明与

3、引用#include#include using namespace std;using namespace std;int main()int main()int A10,B10;int A10,B10;int i;int i;for(i=0;i10;i+)for(i=0;i10;i+)Ai=i*2-1;Ai=i*2-1;B10-i-1=Ai;B10-i-1=Ai;for(i=0;i10;i+)for(i=0;i10;i+)coutcout AA i i =Ai;Ai;coutcout B B i i =BiBi endl;endl;二维数组的声明及引用二维数组的声明及引用声明声明类型说明符

4、类型说明符 数组名数组名 常量表达式常量表达式 常量表达式常量表达式;例如:例如:float a34;float a34;a0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解为:可以理解为:存储顺序存储顺序:按行存放,上例中数组按行存放,上例中数组a的存储顺序为:的存储顺序为:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23引用引用 例如例如:b12=a23/2(下标不要越界)(下标不要越界)数组作为函数参数数组作为函数参数1 1)数组元素作实参,与单个变量一样数组元素作实参,与单个变量一

5、样2 2)数组名作参数,形、实参数都应是数组数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址名,类型要一样,传送的是数组首地址对形参数组的改变会直接影响到实参数组对形参数组的改变会直接影响到实参数组例例4-24-2:使用数组名作为函数参数:使用数组名作为函数参数定义一个函数,计算定义一个函数,计算矩阵矩阵中中每一行的元素之和,每一行的元素之和,将和直接存放在每行的第一个元素中将和直接存放在每行的第一个元素中主函数测试主函数测试#include#include using namespace std;using namespace std;void RowSum(int A4

6、,int nrow)void RowSum(int A4,int nrow)int sum;int sum;for(int i=0;i nrow;i+)for(int i=0;i nrow;i+)sum=0;sum=0;for(int j=0;j 4;j+)for(int j=0;j 4;j+)sum+=Aij;sum+=Aij;cout Sum of row i cout Sum of row i is sum endl;is sum endl;Ai0=sum;Ai0=sum;int main()int main()int Table34=1,2,3,4,2,3,4,5,3,4,5,6;in

7、t Table34=1,2,3,4,2,3,4,5,3,4,5,6;for(int i=0;i 3;i+)for(int i=0;i 3;i+)for(int j=0;j 4;j+)for(int j=0;j 4;j+)cout Tableij endl;cout Tableij endl;RowSum(Table,3);RowSum(Table,3);for(int i=0;i 3;i+)for(int i=0;i 3;i+)cout Tablei0 cout Tablei0;运行结果:运行结果:1 2 3 41 2 3 42 3 4 52 3 4 53 4 5 63 4 5 6Sum of

8、 row 0 is 10Sum of row 0 is 10Sum of row 1 is 14Sum of row 1 is 14Sum of row 2 is 18Sum of row 2 is 1810 14 1810 14 184.2 4.2 指针指针内存空间的访问方式内存空间的访问方式通过变量名访问通过变量名访问通过地址访问通过地址访问地址运算符:地址运算符:&例:例:int var;int var;则则&var&var 表示变量表示变量varvar在内存中的起在内存中的起始地址始地址指针:内存地址,用于间接访问内存单元指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量

9、指针变量:用于存放地址的变量声明声明:例:例:int i;int i;int*p int*p =&i;&i;指向整型变量的指针指向整型变量的指针内存用户数据区内存用户数据区变量变量 i i变量变量 j j变量变量p p3 36 620002000200020002004200430103010引用引用:例例1 1:i i =3;3;例例2 2:*p*p =3;3;指针变量的初始化指针变量的初始化语法形式语法形式存储类型存储类型 数据类型数据类型*指针名初始地址;指针名初始地址;例:例:int*pa=&a;int*pa=&a;注意事项注意事项用变量地址作为初值时,该变量必须在指针初用变量地址作为

10、初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型始化之前已说明过,且变量类型应与指针类型一致一致可以用一个已赋初值的指针去初始化另一可以用一个已赋初值的指针去初始化另一 个指个指针变量针变量不要用一个内部不要用一个内部 auto auto 变量去初始化变量去初始化 static static 指指针针指针变量的赋值运算指针变量的赋值运算指针名指针名=地址地址“地址地址”中存放的数据类型与指针类型必须相符中存放的数据类型与指针类型必须相符向指针变量赋的值必须是地址常量或变量,不向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数能是普通整数。但可以赋值为整数0

11、 0,表示空,表示空指针指针指针的类型是它所指向变量的类型,而不是指指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数针本身数据值的类型,任何一个指针本身的数据值都是据值都是unsigned long intunsigned long int型型允许声明指向允许声明指向 void void 类型的指针。该指针可以类型的指针。该指针可以被赋予任何类型对象的地址被赋予任何类型对象的地址。例:例:void void*general;*general;例:指针的声明、赋值与使用例:指针的声明、赋值与使用#include#includeusing namespace std

12、;using namespace std;int main()int main()int int *i_pointer;*i_pointer;int int i;i;i_pointer=&i;i_pointer=&i;i=10;i=10;cout cout Output int i=Output int i=i i endl;endl;cout cout Output int pointer i=Output int pointer i=*i_pointer*i_pointer endl;endl;程序运行的结果是:程序运行的结果是:Output int i=10Output int i=10

13、Output int pointer i=10Output int pointer i=10指针变量的算术运算指针变量的算术运算指针与整数的加减运算指针与整数的加减运算指针指针p p加上或减去加上或减去n n,其意义,其意义是指针当前指向位置的前方是指针当前指向位置的前方或后方第或后方第n n个数据的地址个数据的地址这种运算的结果值取决于指这种运算的结果值取决于指针指向的数据类型针指向的数据类型指针加一,减一运算指针加一,减一运算指向下一个或前一个数据指向下一个或前一个数据例如:例如:y=*px+y=*px+相当于相当于 y=*(px+)y=*(px+)(*(*和和+优先级相同,自右向优先级相

14、同,自右向左运算左运算)pa-2pa-2pa-1pa-1pa+1pa+1pa+2pa+2pa+3pa+3*(pa-2)*(pa-2)*pa*pa*(pa+1)*(pa+1)*(pa+2)*(pa+2)*(pa+3)*(pa+3)*(pa-1)*(pa-1)short*pashort*papb-1pb-1pbpbpb+1pb+1pb+2pb+2*(pb-1)*(pb-1)*pb*pb*(pb+1)*(pb+1)*(pb+2)*(pb+2)long*pblong*pb指针变量的关系运算指针变量的关系运算关系运算关系运算指向相同类型数据的指针之间可以进行各种关指向相同类型数据的指针之间可以进行各种关

15、系运算。系运算。指向不同数据类型的指针,以及指针与一般整指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系运指针可以和零之间进行等于或不等于的关系运算。例如:算。例如:p=0p=0或或p!=0p!=0赋值运算赋值运算向指针变量赋的值必须是地址常量或变量,不向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数能是普通整数。但可以赋值为整数0 0,表示空,表示空指针指针指向数组元素的指针指向数组元素的指针声明与赋值声明与赋值例:例:int a10,*pa;int a10,*pa;pa=&a

16、0;pa=&a0;或或 pa=a;pa=a;通过指针引用数组元素通过指针引用数组元素经过上述声明及赋值后:经过上述声明及赋值后:*pa*pa就是就是a0a0,*(pa+1)*(pa+1)就是就是a1a1,.,*(pa+i)*(pa+i)就是就是ai.ai.ai,*(pa+i),*(a+i),paiai,*(pa+i),*(a+i),pai都是等效的。都是等效的。不能写不能写 a+a+,因为,因为a a是数组首地址是常量是数组首地址是常量设有一个设有一个intint型数组型数组a a,有,有1010个元素。用三种个元素。用三种方法输出各元素:方法输出各元素:(1)(1)使用数组名和下标使用数组名

17、和下标;(2);(2)使用数组名和指针运算使用数组名和指针运算;(3);(3)使用指针变使用指针变量量使用数组名和下标使用数组名和下标int main()int main()int a10;int a10;int i;int i;for(i=0;i10;i+)for(i=0;iai;cinai;coutendl;coutendl;for(i=0;i10;i+)for(i=0;i10;i+)coutai;coutai;使用数组名和指使用数组名和指针运算针运算int main()int main()int a10;int a10;int i;int i;for(i=0;i10;i+)for(i=0

18、;iai;cinai;coutendl;coutendl;for(i=0;i10;i+)for(i=0;i10;i+)cout*(a+i);cout*(a+i);使用指针变量使用指针变量int main()int main()int a10;int a10;int*p,i int*p,i;for(i=0;i10;i+)for(i=0;iai;cinai;coutendl;coutendl;for(p=a;p(a+10);p+)for(p=a;p(a+10);p+)cout*p;cout*p;指针数组指针数组数组的元素是指针型数组的元素是指针型例:例:Point *pa2;Point *pa2;

19、数数组组papa由由pa0,pa1pa0,pa1两两个指针组成个指针组成例:利用指针数组存例:利用指针数组存放单位矩阵放单位矩阵#include#include using namespace std;using namespace std;int main()int main()int line1=1,0,0;int line1=1,0,0;int line2=0,1,0;int line2=0,1,0;int line3=0,0,1;int line3=0,0,1;int*p_line3;int*p_line3;p_line0=line1;p_line0=line1;p_line1=lin

20、e2;p_line1=line2;p_line2=line3;p_line2=line3;/输出单位矩阵输出单位矩阵 coutMatrix test:endl;coutMatrix test:endl;for(int i=0;i3;i+)/for(int i=0;i3;i+)/对指针数组元素循环对指针数组元素循环 for(int j=0;j3;j+)/for(int j=0;j3;j+)/对矩阵每一行循环对矩阵每一行循环 coutp_lineij;coutp_lineij;coutendl;coutendl;输出结果为:输出结果为:Matrix test:Matrix test:1,0,01,

21、0,00,1,00,1,00,0,10,0,1以指针作为函数参数以指针作为函数参数以地址方式传递数据,以地址方式传递数据,可以用来返回函数处可以用来返回函数处理结果理结果实参是数组名时形参实参是数组名时形参可以是指针可以是指针题目:读入三个浮点题目:读入三个浮点数,将整数部分和小数,将整数部分和小数部分分别输出数部分分别输出#include#include using namespace std;using namespace std;void splitfloat(float x,void splitfloat(float x,int*intpart,float int*intpart,fl

22、oat*fracpart)*fracpart)/形参形参intpartintpart、fracpartfracpart是指针是指针 *intpart=int(x);*intpart=int(x);/取取x x整数部分整数部分 *fracpart=x-*intpart;/*fracpart=x-*intpart;/取取x x小数部分小数部分 int main()int main()int i,n;int i,n;float x,f;float x,f;coutEnter three(3)floating point numberscoutEnter three(3)floating point

23、numbers:endl endl;for(i=0;i 3;i+)for(i=0;i x;cin x;splitfloat(x,&n,&f);splitfloat(x,&n,&f);/变量地址做实参变量地址做实参 coutInteger Part is n Fraction Part is fendl;coutInteger Part is n Fraction Part is fsize;cinsize;array=new array=new intsize;intsize;/数组大小可以是变量数组大小可以是变量deletedelete array;/array;/释放释放堆内存堆内存数组的

24、创建与删除数组的创建与删除也可以创建多维数组,其也可以创建多维数组,其中第一维可以是变量,中第一维可以是变量,其他维数必须是常量其他维数必须是常量int row=3;int row=3;const int col=5;const int col=5;double(*ptr)col=new double(*ptr)col=new doublerowcol;doublerowcol;delete ptr;delete ptr;#include#include#include#includeusing namespace std;using namespace std;int main()int m

25、ain()float(*cp)float(*cp)5 5;cp=new floatcp=new float4 45 5;int i,j;int i,j;for(i=0;ifor(i=0;i4 4;i+);i+)for(j=0;j for(j=0;j5 5;j+);j+)*(*(cp+i)+j)=i*10+j*1;*(*(cp+i)+j)=i*10+j*1;for(i=0;ifor(i=0;i4 4;i+);i+)for(j=0;jfor(j=0;j5 5;j+);j+)coutcpij ;coutcpij ;coutendl;coutendl;coutendl;coutendl;运行结果为:运

26、行结果为:0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34#include Point.h#include Point.hint main()int main()coutStep coutStep One:endl;One:endl;Point*Ptr1=Point*Ptr1=new Point;new Point;delete Ptr1;delete Ptr1;coutStep coutStep Two:endl;Two:endl;Ptr1=new Point(1,2);Ptr1=new Point(1,2);delete Ptr1

27、;delete Ptr1;return 0;return 0;#include#includeusing namespace std;using namespace std;class Pointclass Point public:public:Point()X=Y=0;Point()X=Y=0;coutDefault Constructor.n;coutDefault Constructor.n;Point Point (int xx,int yy)X=xx;Y=yy;(int xx,int yy)X=xx;Y=yy;cout Constructor called.n;cout Const

28、ructor called.n;Point()coutDestructor called.n;Point()coutDestructor called.n;int GetX()int GetX()return X;return X;int GetY()int GetY()return Y;return Y;void Move(int x,int y)X=x;Y=y;void Move(int x,int y)X=x;Y=y;private:private:int X,Y;int X,Y;运行结果:运行结果:Step One:Default Constructor.Destructor call

29、ed.Step Two:Constructor called.Destructor called.常见的内存错误及其对策常见的内存错误及其对策1 1)内存分配未成功,却使用了它。)内存分配未成功,却使用了它。动态分配不成功时,指针为空指针动态分配不成功时,指针为空指针(NULL)(NULL)。如果是用如果是用newnew来申请内存,应该用来申请内存,应该用if(p=NULL)if(p=NULL)或或if(p!=NULL)if(p!=NULL)进行防错处理。进行防错处理。2 2)内存分配虽然成功,但是尚未初始化就)内存分配虽然成功,但是尚未初始化就引用它引用它内存的缺省初值究竟是什么并没有统一的

30、标准。内存的缺省初值究竟是什么并没有统一的标准。所以必须赋初值后方可以使用,即便是赋零值所以必须赋初值后方可以使用,即便是赋零值也不可省略也不可省略3 3)内存分配成功并且已经初始化,但操作越过了)内存分配成功并且已经初始化,但操作越过了内存的边界内存的边界例如在使用数组时经常发生下标例如在使用数组时经常发生下标“多多1”1”或者或者“少少1”1”的的操作。特别是在操作。特别是在forfor循环语句中,循环次数很容易搞错,循环语句中,循环次数很容易搞错,导致数组操作越界导致数组操作越界4 4)忘记了释放内存,造成内存泄露)忘记了释放内存,造成内存泄露程序执行时申请的内存忘了释放,函数每被调用一

31、次程序执行时申请的内存忘了释放,函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,终有一就丢失一块内存。刚开始时系统的内存充足,终有一次程序突然死掉:内存耗尽次程序突然死掉:内存耗尽5 5)释放了内存却继续使用它)释放了内存却继续使用它动态内存的申请与释放必须配对动态内存的申请与释放必须配对4.4 4.4 深拷贝与浅拷贝深拷贝与浅拷贝C+C+提供的默认拷贝构造函数只是对对象进行浅提供的默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝)拷贝复制(逐个成员依次拷贝)testCopy1深拷贝深拷贝当被复制的对象数据成员是指针类型时,不是当被复制的对象数据成员是指针类型时,不是复制该指

32、针成员本身,而是将指针所指的对象复制该指针成员本身,而是将指针所指的对象进行复制进行复制testCopy24.5 4.5 字符串字符串1 1使用字符数组和字符指针实现字符串使用字符数组和字符指针实现字符串例如:例如:char str10=char str10=hellohello;char*pStr=char*pStr=welcomewelcome;说明:可以初始化,但是不能赋值。例如:说明:可以初始化,但是不能赋值。例如:char str10 char str10;str=str=hellohello;/;/错误错误2 2C+C+中提供了中提供了stringstring类型,更方便类型,更方

33、便 string string是是C+C+标准库中声明的一个字符串类。标准库中声明的一个字符串类。#include include 1 1)定义字符串变量。)定义字符串变量。与与intint、charchar等基本数据类型的定义方法类似例如:等基本数据类型的定义方法类似例如:string str1;/string str1;/定义变量定义变量string str2=China;/string str2=China;/定义的同时进行初始化定义的同时进行初始化初始化初始化stringstring对象的方法还有:对象的方法还有:string name(ZhangSan);string name(Zh

34、angSan);string person(name);string person(name);string set(set2,5);string set(set2,5);string Name(fullName,0,7);string Name(fullName,0,7);2 2)字符串变量的赋值)字符串变量的赋值与运算与运算 =、+=+=等等赋值语句赋值赋值语句赋值+连接运算连接运算 数组下标数组下标关系运算符关系运算符、=、=、=、!=!=:实现字:实现字符串的比较符串的比较 例如:例如:string str1,str2;string str1,str2;str1 str1Beijing

35、;Beijing;/利用字符串常量赋值利用字符串常量赋值 str2str2 =str1;str1;/利用字符串变量赋值利用字符串变量赋值 str2+=str1+Welcome;str2+=str1+Welcome;cout str2 endl;cout str2 str1str2str13 3)字符串变量的输入与输出)字符串变量的输入与输出可以在输入输出语句中用字符串变量名输入可以在输入输出语句中用字符串变量名输入输出字符串。例如:输出字符串。例如:string str1;string str1;cincin str1;str1;coutcout str2;str2;输入一行字符输入一行字符g

36、etline(cin,str1);getline(cin,str1);5 5)字符串数组)字符串数组string strArray10;string strArray10;string strArray=zhang,li,wang,tan;string strArray=zhang,li,wang,tan;说明:说明:数组中的每个元素存放的是一个字符串(而数组中的每个元素存放的是一个字符串(而不是一个字符),相当于是一个字符串变量不是一个字符),相当于是一个字符串变量不要求每个字符串元素具有相同的长度不要求每个字符串元素具有相同的长度每个字符串变量分配固定的是字节数(每个字符串变量分配固定的是

37、字节数(VCVC是是4 4个字节),存放的是字符串的地址个字节),存放的是字符串的地址string string 的函数成员:的函数成员:s.size()s.size()s.length()s.length()pare(str);pare(str);s.empty();s.empty();s.substr(x,n);s.substr(x,n);s.replace(x,n,str);s.replace(x,n,str);s.find(str);s.find(str);s.empty();s.empty();#include#include#include#include using namesp

38、ace std;using namespace std;void RMBFormat(string&);void RMBFormat(string&);int main()int main()string input;string input;cout cout input;cin input;RMBFormat(input);RMBFormat(input);cout cout 格式化结果:格式化结果:;cout input endl;cout input 3)if(dp3)for(int x=dp-3;x0;x-=3)for(int x=dp-3;x0;x-=3)currency.insert(x,);currency.insert(x,);currency.insert(0,RMB);currency.insert(0,RMB);

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

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁