C++第五章数组与指针PPT

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

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

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

资源描述

本章将深入学习数组包括多维数组的知识和应用,以及它们与指针的关系。C++语言拥有在运行时获得变量地址和操纵地址的能力,这种可用来操纵地址的变量类型就是指针。指针可以用于数组,用于内存访问,还可作为函数的参数。第五章数组与指针第五章数组与指针5.1数组5.5数组与指针5.4this指针5.3指针与地址5.2多维数组5.7多级指针与多维数组(选读)5.6字符串5.1数组C++的数据类型:基本数据类型亦称内置数据类型。C++为它们提供了内置的支持(协助函数),以完成各种允许的运算。也就是说基本数据类型也是一个类:有数据有操作,两者是封装起来的。在C++的标准库中支持基本类抽象的组合,如字符串类,复数类等标准库类类型。在内置数据类型和标准库类类型之间是复合类型(Compoundtype),特别是指针和数组类型。5.1数组5.1.1数组、数组元素及其存储方式5.1.2数组名作为函数参数5.1.3数组的应用——回溯算法(选读)5.1.1数组与数组元素及其存储方式数组的引入:数组(array)是一种顺序容器(sequencecontainer),是由单一类型元素组成的一个有序集合:intfibon[10]={0,1,1,2,3,5,8,13,21,34};01232134fibon[2]fibon[3]fibon[0]fibon[1]fibon[8]fibon[9]图5.1数组在内存中的存储数组元素的访问方式:通过下标操作符(subscript),按元素在数组中的位置进行访问,称为索引访问(indexing)或下标访问(subscripting)。参见图5.1。注意:1:数组是一种组合类型,是不能作为一个整体进行访问和处理的,只能按元素进行个别的访问和处理。2:C++数组第一个元素的下标为0,而不是1,且下标表达方式是固定的。3:数组元素在内存中是从低地址开始顺序排列,各元素的存储单元占用内存大小相同,各元素的存储单元之间没有空隙,可以从数组第一个元素存储单元的起始地址计算出任意一个元素存储单元的起始地址。5.1.1数组与数组元素及其存储方式【例5.1】找出整型数组各元素中的最大数和最小数。数组中的数由随机数函数rand()产生。【例5.1】找最大数和最小数constSIZE=15;intmain(){intarr[SIZE],i,high,low;for(i=0;iSIZE;i++)arr[i]=rand()%100;coutHerearetheSIZErandomnumbers:endl;for(i=0;iSIZE;i++)coutarr[i]'\t';coutendl;high=arr[0];//初始化时最大和最小值均为数组首元素low=arr[0];for(i=1;iSIZE;i++){if(arr[i]high)high=arr[i];if(arr[i]low)low=arr[i];}couthighestvalueishighendl;coutlowestvalueislowendl;return0;}5.1.1数组与数组元素及其存储方式结构数组定义:structkeyword{charword[16];//关键字intcount;//该关键字将在源程序中出现的次数};初始化:keywordkeytab[]={auto,0,break,0,case,0,char,0,……unsigned,0,volatile,0,while,0,};结构数组初始化时可以用括号来区分每一个结构,例如:keywordkeytab[]={{auto,0},{break,0},{case,0},……};当提供了数组中所有结构值时,不必用这种括号的形式。5.1.1数组与数组元素及其存储方式对象数组定义:CGoodsgoods[3];该商品类对象数组包含3个商品对象数组元素,系统调用3次缺省的构造函数来建立这3个商品对象数组元素。初始化:应该完整书写各个元素的构造函数及成员数据初值:CGoodsgoods[3]={CGoods(夏利2000,30,98000.0),CGoods(桑塔纳2000,164000.0),CGoods()};5.1.2数组名作为函数参数数组名作为参数:数组名可以作为函数的参数。在函数调用时传递实参数组的首地址,所以在被调函数中对形参数组的处理实际就是对调用函数的实参数组的处理。C++只传递数组首地址,而对数组边界不加检查。这带来的好处是,函数对长度不等的同类数组都通用。如要指定长度可以设定另一个参数来传递数组元素的个数。【例5.2】字符数组与字符数组相连接【例5.2】字符数组与字符数组相连接【例5.2】字符数组与字符数组相连接#includeiostream.hvoidstrcat(chars[],charct[]){inti=0,j=0;while(s[i]!=0)i++;while(ct[j]!=0)s[i++]=ct[j++];s[i]='\0';}voidmain(void){chara[40]=李明;charb[20]=是东南大学学生;strcat(a,b);coutaendl;//打印字符数组a}5.2多维数组5.2.1多维数组5.2.2多维数组作为函数参数C++中数组可以嵌套,就是多维数组。二维数组:一维数组可对应数学中的向量,而二维数组可对应矩阵,可用一个二维数组存储矩阵。5.2.1多维数组存储与访问方式119753117131175312108642二维数组的横向称为行,纵向称为列,上面这个数组为三行六列。定义二维数组的通用格式为:《存储类型》类型数组名[常量行表达式][常量列表达式];行与列用常量表达式表示。5.2.1多维数组存储与访问方式二维数组分析:上面的数组可定义为:intmat[3][6];第一行第一列的元素为mat[0][0],第三行第六列元素为mat[2][5],下标仍是从0开始。计算机内存是一维编址的,多维数组必须要转化为一维方式存储,越右的下标变化越快,二维数组则按行排列,先排第一行,再排第二行,直到所有行排完:mat[0][0]mat[0][1]mat[0][2]mat[0][3]mat[0][4]mat[0][5]mat[1][0]mat[1][1]mat[1][2]mat[1][3]mat[1][4]mat[1][5]mat[2][0]mat[2][1]mat[2][2]mat[2][3]mat[2][4]mat[2][5]即所谓按行排列。5.2.1多维数组存储与访问方式有了确定的关系后可以算出多维数组任一元素在内存的位置,设有a数组m行n列,每个元素占b个字节,a[i][j]的首地址为:数组的首地址+(i*n+j)*b;多维数组分析:C/C++中的多维数组基本的定义是以数组作为元素构成的数组,二维数组的数组元素是一维数组,三维数组的数组元素是一个二维数组,依此类推。也就是说,多维数组用的是一个嵌套的定义。5.2.1多维数组存储与访问方式图5.36*3*4的三维数组图5.3表示一个三维数组可定义为:inta3d[6][3][4];a3d是由6个二维数组构成的数组,其中第一个二维数组用a3d[0]表示,即图5.3立方体最上面的3*4大小的一片,也就是一个3*4的二维数组。而a3d[0][2]则是a3d[0]的第3个元素,一个一维数组,立方体最上最右的一条,(阴影所示)即一个4元素的一维数组。5.2.1多维数组存储与访问方式多维数组的数组名:代表数组中第一维(最高维)第一个元素(0号元素)在内存中的首地址,如三维数组的数组名代表的是组成三维数组的第一个二维数组的存储首地址。当数组作为函数的参数进行传递时,多维数组同样是作为第一维第一个数组的首地址传递给函数,所以物理上是传地址。在函数中对形参的数组元素的修改实际上是对作为实参的原数组的元素进行修改。5.2.1多维数组存储与访问方式初始化:对于二维数组,可用嵌套一维数组初始化进行:intmatrix[3][6]={{1,3,5,7,9,11},{2,4,6,8,10,12},{3,5,7,11,13,17}};也可以按数组元素存储次序列出各元素的值:intmatrix[3][6]={1,3,5,7,9,11,2,4,6,8,10,12,3,5,7,11,13,17};还可以对部分元素赋初值,没有明确初值的元素清0:intmatrix[3][6]={{1,3},{2,4},{3,5,7}};其结果等效于:intmatrix[3][6]={{1,3,0,0,0,0},{2,4,0,0,0,0},{3,5,7,0,0,0}};5.2.1多维数组存储与访问方式初始化:最后还可由初始化数据来确定数组最高维,如intmatrix[][6]={1,3,5,7,9,11,2,4,6,8,10,12,3,5,7,11,13,17};结果定义的matrix是三行六列的数组。也可以intmatrix[][6]={{1,3},{2,4},{3,5,7}};同样也是三行六列。注意这里只能最高维缺省。5.2.1多维数组存储与访问方式多维数组作为参数:在作为函数的形式参数时,可以最高维(第一维)缺省。因为编译器只要根据后面每一维(从第二维开始)的大小,就可计算数组每一个元素的存储位置。基于同样的理由,也只能缺省第一维。进一步考虑,对多维数组,编译器不检查边界,其实只是不检查最高维(第一维)的边界,较低各维的大小是在控制之中的。复合类型只能对各元素逐个操作,不能整体操作。【例】多维数组的输入输出。【例5.4】已知矩阵intmax[8][8],找出其中的极点与鞍点。【例5.4】矩阵极点与鞍点#includeiostream#includeiomanipUsingnamespacestd;intmat[8][8]={0,3,5,7,11,┅,25,19,16,14};intmaxmin(inta,intb,intc){//判断相邻3元素中间元素是否最大或最小if(ab&&bc)return-1;elseif(ab&&bc)return1;elsereturn0;}//b为最大返回1,最小返-1,其他为0intmain(void){inti,j,k,l;for(i=1;i=6;i++)for(j=1;j=6;j++){k=maxmin(mat[i][j-1],mat[i][j],mat[i][j+1]);if(k==0)continue;l=maxmin(mat[i-1][j],mat[i][j],mat[i+1][j]);if(l==0)continue;if(k==1&&l==1)cout极大点:;elseif(k==-1&&l==-1)cout极小点:;elsecout“鞍点:”;coutsetw(2)mat[i][j];i=i;j=jendl;}return0;}【例5.4】矩阵极点与鞍点5.2.2多维数组作为函数参数【例5.5】矩阵转置与矩阵相乘。缺陷与改进:多维数组作为函数参数,最高维可以不写,但较低维必须明确标出。这限定了二维数组的构造,所以用二维数组进行矩阵运算很难表示成通用的算法。既然二维数组使用一维数组方式存储,则用一维数组加上行列信息传递,可不受数组构造的限制。【例5.5】矩阵转置与矩阵相乘voidinverse(int[3][6],int[6][3]);//转置矩阵voidmulti(int[6][3],int[3][4],int[6][4]);//矩阵乘法voidoutput(int[6][4]);//矩阵输出Intmain(){intmiddle[6][3],result[6][4];intmatrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6};intmatrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4};inver

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

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

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

×
保存成功