您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > c++语言程序设计(郑莉第四版)课件6
第六章数组指针与字符串清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容数组指针动态存储分配指针与数组指针与函数vector的基本用法字符串深度探索C++语言程序设计清华大学郑莉3数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。数组用于存储和处理大量同类型数据的数据结构。数组下标的个数称为数组的维数。数组C++语言程序设计清华大学郑莉4一维数组的声明与引用一维数组的声明类型说明符数组名[常量表达式];例如:inta[10];表示a为整型数组,有10个元素:a[0]...a[9]引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组例如:a[0]=a[5]+a[7]-a[2*3]注意:(1)下标表达式合法并为整数值(2)下标不得越界(即超出数组的边界)数组名的构成方法与一般变量名相同。数组C++语言程序设计清华大学郑莉5例6.1一维数组的声明与引用#includeiostreamusingnamespacestd;intmain(){inta[10],b[10];for(inti=0;i10;i++){a[i]=i*2-1;b[10-i-1]=a[i];//b是a的逆序}for(inti=0;i10;i++){couta[i]=a[i];coutb[I]=b[i]endl;}return0;}数组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一维数组的初始化可以在定义数组的同时赋给初值:–在声明数组时对数组元素赋以初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};–可以只给一部分元素赋初值。例如:staticinta[10]={0,1,2,3,4};–在对全部数组元素赋初值时,可以不指定数组长度。例如:staticinta[]={1,2,3,4,5}–注意:如果数组没有指定元素初值,静态生存期的元素的初值为0,动态生存期的元素的初值不确定。数组C++语言程序设计清华大学郑莉8#includeiostreamusingnamespacestd;intmain(){intf[20]={1,1};//初始化第0、1个数for(inti=2;i20;i++)//求第2~19个数f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){//输出,每行5个数if(i%5==0)coutendl;cout.width(12);//设置输出宽度为12coutf[i];}return0;}例:用数组来处理求Fibonacci数列问题C++语言程序设计清华大学郑莉9例:用数组来处理求Fibonacci数列问题运行结果:11235813213455891442333776109871597258441816765C++语言程序设计清华大学郑莉10一维数组应用举例循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止。每组连续输入5个答案,每个答案可以是'a'..'d'。数组#includeiostreamusingnamespacestd;intmain(){constcharKEY[]={'a','c','b','a','d'};constintNUM_QUES=5;charc;intques=0,numCorrect=0;coutEntertheNUM_QUESquestiontests:endl;while(cin.get(c)){if(c!='\n'){if(c==key[ques]){numCorrect++;cout;}elsecout“*”;//表示答案错误ques++;}else{coutScorestatic_castfloat(numCorrect)/NUM_QUES*100%;ques=0;numCorrect=0;coutendl;}}return0;}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++语言程序设计清华大学郑莉14存储顺序按行优先存放,上例中数组a的存储顺序为:二维数组的声明类型说明符数组名[常量表达式][常量表达式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13a[2]——a20a21a22a23a可以理解为:引用例如:b[1][2]=a[2][3]/2下标不要越界二维数组的声明及引用数组C++语言程序设计清华大学郑莉15将所有数据写在一个{}内,按顺序赋值例如:inta[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}};二维数组的初始化数组C++语言程序设计清华大学郑莉16数组作为函数参数数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。特别注意:对形参数组的改变会直接影响到实参数组。数组C++语言程序设计清华大学郑莉17例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。数组#includeiostreamusingnamespacestd;voidrowSum(inta[][4],intnRow){for(inti=0;inRow;i++){for(intj=1;j4;j++)a[i][0]+=a[i][j];}}intmain(){//主函数inttable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};//声明并初始化数组18//输出数组元素for(inti=0;i3;i++){for(intj=0;j4;j++)couttable[i][j];coutendl;}rowSum(table,3);//调用子函数,计算各行和//输出计算结果for(inti=0;i3;i++)coutSumofrowiistable[i][0]endl;return0;}19运行结果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is1820C++语言程序设计清华大学郑莉21对象数组声明:类名数组名[元素个数];访问方法:通过下标访问数组名[下标].成员名数组C++语言程序设计清华大学郑莉22对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Pointa[2]={Point(1,2),Point(3,4)};如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用缺省构造函数)。数组C++语言程序设计清华大学郑莉23数组元素所属类的构造函数不声明构造函数,则采用缺省构造函数。各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。数组C++语言程序设计清华大学郑莉24例6-3对象数组应用举例//Point.h#ifndef_POINT_H#define_POINT_HclassPoint{//类的定义public://外部接口Point();Point(intx,inty);~Point();voidmove(intnewX,intnewY);intgetX()const{returnx;}intgetY()const{returny;}staticvoidshowCount();//静态函数成员private://私有数据成员intx,y;};#endif//_POINT_H数组//Point.cpp#includeiostream#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){coutMovingthepointto(newX,newY)endl;x=newX;y=newY;}25//6-3.cpp#includePoint.h#includeiostreamusingnamespacestd;intmain(){coutEnteringmain...endl;Pointa[2];//定义对象数组for(inti=0;i2;i++)a[i].move(i+10,i+20);coutExitingmain...endl;return0;}26运行结果:Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Movingthepointto(10,20)Movingthepointto(11,21)Exitingmain...Destructorcalled.Destructorcalled.27C++语言程序设计清华大学郑莉28关于内存地址内存空间的访问方式–通过变量名访问–通过地址访问地址运算符:&例:intvar;则&var表示变量var在内存中的起始地址C++语言程序设计清华大学郑莉29•指针可以方便、灵活、有效地组织和表示复杂的数据结构,提高大数据量处理的效率,可以有效分配和管理动态内存。•计算机的内存被划分为存储单元,存储单元按一定规则编号,这个编号就是存储单元的地址。•具有静态生存期的变量在程序开始运行之前就已经分配了内存空间。•具有动态生存期的变量,是在程序运行时遇到变量声明语句时被分配内存空间。•在变量获得内存空间的同时,变量名也成了对应内存空间的名称。指针指针变量的作用C++语言程序设计清华大学郑莉30声明例:inti;int*ptr=&i;指向整型变量的指针概念指针:内存地址,用于间接访问内存单元指针变量:用于存放地址的变量20003ptr*ptri2000内存用户数据区变量i变量j变量ptr362000200020043010引用例1:i=3;例2:*ptr=3;指针指针变量的概念C++语言程序设计清华大学郑莉31语法形式数据类型*指针名=初始地址;例:int*pa=&a;注意事项–用变量地址
本文标题:c++语言程序设计(郑莉第四版)课件6
链接地址:https://www.777doc.com/doc-4803847 .html