《C++语言程序设计》第六章 数组 指针与字符串

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第六章数组指针与字符串清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容数组指针动态存储分配指针与数组指针与函数字符串C++语言程序设计清华大学郑莉3数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。数组C++语言程序设计清华大学郑莉4一维数组的声明与引用一维数组的声明类型说明符数组名[常量表达式];例如:inta[10];表示a为整型数组,有10个元素:a[0]...a[9]引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组例如:a[0]=a[5]+a[7]-a[2*3]数组名的构成方法与一般变量名相同。数组C++语言程序设计清华大学郑莉5例6.1一维数组的声明与引用#includeiostreamusingnamespacestd;intmain(){intA[10],B[10];inti;for(i=0;i10;i++){A[i]=i*2-1;B[10-i-1]=A[i];}数组for(i=0;i10;i++){coutA[i]=A[i];coutB[i]=B[i]endl;}}C++语言程序设计清华大学郑莉6一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组a,在内存中的存放次序如下:数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a数组C++语言程序设计清华大学郑莉7一维数组的初始化可以在编译阶段使数组得到初值:–在声明数组时对数组元素赋以初值。例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9};–可以只给一部分元素赋初值。例如:staticinta[10]={0,1,2,3,4};–在对全部数组元素赋初值时,可以不指定数组长度。例如:staticinta[]={1,2,3,4,5}数组C++语言程序设计清华大学郑莉8#includeiostreamusingnamespacestd;intmain(){inti;staticintf[20]={1,1};//初始化第0、1个数for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];//求第2~19个数for(i=0;i20;i++)//输出,每行5个数//{if(i%5==0)coutendl;cout.width(12);//设置输出宽度为12coutf[i];}}例:用数组来处理求Fibonacci数列问题C++语言程序设计清华大学郑莉9例:用数组来处理求Fibonacci数列问题运行结果:11235813213455891442333776109871597258441816765C++语言程序设计清华大学郑莉10一维数组应用举例循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止。每组连续输入5个答案,每个答案可以是'a'..'d'。数组#includeiostreamusingnamespacestd;intmain(){charkey[]={'a','c','b','a','d'};charc;intques=0,numques=5,numcorrect=0;coutEnterthenumquesquestiontests:endl;while(cin.get(c)){if(c!='\n')if(c==key[ques]){numcorrect++;cout;}elsecout*;else{coutScorefloat(numcorrect)/numques*100%;ques=0;//resetvariablesnumcorrect=0;coutendl;continue;}ques++;}}11运行结果:acbba**Score60%acbadScore100%abbda***Score40%bdcba*****Score0%12C++语言程序设计清华大学郑莉13二维数组的声明及引用数据类型标识符[常量表达式1][常量表达式2]…;例:inta[5][3];表示a为整型二维数组,其中第一维有5个下标(0~4),第二维有3个下标(0~2),数组的元素个数为15,可以用于存放5行3列的整型数据表格。数组C++语言程序设计清华大学郑莉存储顺序按行存放,上例中数组a的存储顺序为:二维数组的声明类型说明符数组名[常量表达式][常量表达式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13a[2]——a20a21a22a23a可以理解为:引用例如:b[1][2]=a[2][3]/2下标不要越界二维数组的声明及引用数组14C++语言程序设计清华大学郑莉将所有数据写在一个{}内,按顺序赋值例如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行给二维数组赋初值例如:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以对部分元素赋初值例如:staticinta[3][4]={{1},{0,6},{0,0,11}};二维数组的初始化数组15C++语言程序设计清华大学郑莉16数组作为函数参数数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。数组C++语言程序设计清华大学郑莉17例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。数组#includeiostreamusingnamespacestd;voidRowSum(intA[][4],intnrow){intsum;for(inti=0;inrow;i++){sum=0;for(intj=0;j4;j++)sum+=A[i][j];coutSumofrowiissumendl;A[i][0]=sum;}}18intmain(){intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};for(inti=0;i3;i++){for(intj=0;j4;j++)coutTable[i][j];coutendl;}RowSum(Table,3);for(inti=0;i3;i++)coutTable[i][0]}19运行结果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is1810141820C++语言程序设计清华大学郑莉21对象数组声明:类名数组名[元素个数];访问方法:通过下标访问数组名[下标].成员名数组C++语言程序设计清华大学郑莉22对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:PointA[2]={Point(1,2),Point(3,4)};如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。数组C++语言程序设计清华大学郑莉23数组元素所属类的构造函数不声明构造函数,则采用默认构造函数。各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。数组C++语言程序设计清华大学郑莉24例6-3对象数组应用举例//Point.h#if!defined(_POINT_H)#define_POINT_HclassPoint{public:Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};#endif数组//6-2.cpp#includeiostreamusingnamespacestd;#includePoint.hPoint::Point(){X=Y=0;coutDefaultConstructorcalled.endl;}Point::Point(intxx,intyy){X=xx;Y=yy;coutConstructorcalled.endl;}Point::~Point(){coutDestructorcalled.endl;}voidPoint::Move(intx,inty){X=x;Y=y;}25#includeiostream#includePoint.husingnamespacestd;intmain(){coutEnteringmain...endl;PointA[2];for(inti=0;i2;i++)A[i].Move(i+10,i+20);coutExitingmain...endl;return0;}26运行结果:Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.27C++语言程序设计清华大学郑莉28关于内存地址内存空间的访问方式–通过变量名访问–通过地址访问地址运算符:&例:intvar;则&var表示变量var在内存中的起始地址C++语言程序设计清华大学郑莉29声明例:staticinti;staticint*i_pointer=&i;指向整型变量的指针指针变量的概念概念指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量20003i_pointer*i_pointeri2000内存用户数据区变量i变量j变量i_pointer362000200020043010引用例1:i=3;例2:*i_pointer=3;指针C++语言程序设计清华大学郑莉30指针变量的初始化语法形式存储类型数据类型*指针名=初始地址;例:int*pa=&a;注意事项–用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。–可以用一个已赋初值的指针去初始化另一个指针变量。–不要用一个内部auto变量去初始化static指针。指针C++语言程序设计清华大学郑莉31指针变量的赋值运算指针名=地址“地址”中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsignedlongint型。允许声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。例:void*general;指针C++语言程序设计清华大学郑莉32例6-5指针的声明、赋值与使用#includeiostreamusingnamespacestd;intmain(){int*i_pointer;//声明int型指针i_pointerinti;//声明int型数ii_pointer=&i;//取i的地址赋给i_pointeri=10;//int型数赋初值coutOutputinti=iendl;//输出int型数的值coutOutputintpointeri=*i_

1 / 118
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功