C++课件C++_第四章_第1页
C++课件C++_第四章_第2页
C++课件C++_第四章_第3页
C++课件C++_第四章_第4页
C++课件C++_第四章_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第4章 复合数据类型,4.1 数组 4.2 指针 4.3 结构体 4.4 自定义类型及枚举 4.5 引用,2,4.1 数组,数组基本概念 数组是同类型数据的有序集合。 集合中的每一个元素称为数组元素。 在数组中的每一个元素都具有一个序号(注意,在C+中此序号从0开始),称为下标。 数组中数组元素的个数称为数组的长度。 掌握一维和二维数组,3,4.1.1 数组的定义 格式: 类型说明符 数组名第1维长度第2维长 度第n维长度; 作用:定义一个n维数组。 类型说明符可以是任何一种数据类型,数组名为用户指定的任一合法C+标识符。 维数必须以常量或常量表达式的形式给出。 数组的维数超过1时即构成了多维数组,多维数组是数组的嵌套 。,4,理解:int a10; int b34; 4.1.2 数组的初始化 完全初始化。 要求初值列表中给定值的个数与数组长度相等,此时各数组元素按对应的位序被赋予给定的值。 如: int array5=1,2,3,4,5; int array =1,2,3,4,5;,5,部分初始化。 初值列表中值的个数小于数组长度,未给出的部分取默认值0。 如:int array5=1,2; static型数组。 如给出初值列表则按列表中给定的值赋值,否则元素的默认值全部为0。 如:static int array5; 等价于static int array5=0,0,0,0,0;,6,4.1.3 数组的使用 数组定义后,可以通过两种方式使用它,一是使用单个数组元素,二是使用整个数组。 1数组元素的使用 数组元素通过下标来使用。 通过下标使用数组元素的方法为: 数组名 下标表达式,7,例4-2 计算并输出二维数组主对角线上元素之和。 #include void main() int i,j,array3=1,2,3,4,5,6,7,8,9; int sum=0; for(i=0;i3;i+) for(j=0;j3;j+) if(i=j) sum+=arrayij; cout“sum is : “sumendl; ,程序运行结果: sum is:15,8,2. 数组的使用 数组还可以做为一个整体加以使用,格式为: 数组名 或 数组名 数组名实质上标识着数组在内存中存放的首地址,是一个地址常量,当需要传送大量同类型数据进行统一处理时,才以传地址的形式用数组名标识整个数组。,9,4.1.4 字符数组与字符串 字符数组,即数组中每一个元素都为字符型,是一种特殊类型数组,常被用来保存和处理字符串。 1. 字符串常量有隐含的结束符“0”,因此其长度是串中字符个数加1。 如:char ss5=“Hello”; 是错误的 。 2. 以字符串常量为字符数组赋值,只允许出现在字符数组初始化时。 如:char ss16;ss1=“Hello”;是错误的。 3. 字符数组正确赋值后,可以使用整个数组来输出字符串。为什么?如: char ss=“Hello World!“; coutssendl; /输出的结果是Hello World!,10,操作字符串的库函数 , string.h 1. 字符串赋值 使用方法:strcpy(目标串,源串); 2. 字符串比较 使用方法:strcmp(字符串1,字符串2); 两个字符串相等结果为0,字符串1大于(按字符的ASCII编码为序)字符串2结果为大于0的数,字符串2大于字符串1结果为小于0的数。,11,3. 字符串连接 使用方法:strcat(字符串1, 字符串2); 返回字符串1的首地址,且字符串1被去掉末尾的结束符0后接续了串2的内容。字符串1必须为字符数组。 4. 字符串求长度 使用方法:strlen(源串); 返回源串的有效字符个数(不包含结束符)。,12,4.2 指针,4.2.1 指针变量的定义 指针变量定义的格式为: 类型说明符 *指针变量名=初始化; 类型说明符是指该指针变量指向的变量所具有的类型。 “*”号表示这里定义的是一个指针类型的变量。 如: int *px; 定义了一个可以指向int型数据的指针变量px,它仅能用来存放int型数据的地址。,13,1. 内存分配 计算机中的内存是编址的。在程序编译或者运行的时候,系统开辟了一张表。每遇到一次声明语句都会开辟一个内存空间,并在表中增加一行纪录。 2. 指针为访问内存空间提供了新的方式 在未引入指针之前,程序中对内存空间的访问是通过变量名的方式,变量名即对它所在的内存空间的一种抽象。指针则提供了更贴近本质、更快捷自由的访问方式。,14,4.2.2 *和&运算 1. *运算 在定义指针时“*”作为指针变量的标志,程序中出现指针名前加*运算符,则表示“取得指针所指向内存单元的内容”的运算。 如: double f=5,*p=&f;/*是标志 cout*pendl; /*是取内容运算,输出为5 2. &运算 “&”作为“取变量地址”的运算。与“*运算”互逆。,15,例4-6 *与 ,程序运行结果: a=10 *pa=10 *(&a)=10 &a=0012FF7C pa=0012FF7C &(*pa)=0012FF7C,16,4.2.3 指针的算术运算 指针可以进行4种算术运算(+,-,+,-)。 1. 指针与整数的加减运算(+,-) 指针 p加上或减去n,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。执行加减运算并不改变指针的指向。 两个同类型的指针可以执行减“-”运算,结果是两个指针之间相差多少个该类型的地址空间。 如: int a,b,c; int *pa=&a,*pb=&b,*pc=&c; 则pa-pb为1,pa-pc为2。 2. 指针自加一,自减一运算(+,-) 指针 p执行自加一或自减一,其意义是修改指针指向到下一个或前一个数据。,17,例4-7 指针的算术运算。 #include void main( ) int a,*pa= ,程序运行结果: &a=0012FF7C pa=0012FF7C pa+1=0012FF80 after pa+1, pa=0012FF7C after pa+, pa=0012FF80,18,4.2.4 指针与数组 1. 数组指针 数组指针是指针,其声明方法与一般指针相同,赋值时接收某一数组的首地址。 例: int a10, *pa; pa=&a0; 或 pa=a; 2. 指针数组 指针数组是数组,其声明的形式与一般的数组相同,只不过它的所有元素都是指针,每一个元素都要指向某一个内存地址。,19,4.2.5 几种特殊的指针 1. void型指针 允许声明void型指针,但该类型指针在使用前必须经过强制类型转换。 如: int a,*pa; void *pv=&a; pa=(int *)pv; 2. 空指针 指针在使用前必须经过正确的初始化,也就是说它应该指向当前程序权限内可访问的内存地址。指向无法确定的指针习惯上称为“野指针”,它可能造成无法想像的破坏,因此当无法确定指针的指向时可以以NULL为值,称为空指针。,20,3. 指针常量与常量指针 指针常量是指该指针的指向不可被更新。 定义指针常量的格式为: 类型* const 指针名; 如: int i=5,j=10; int* const p= /错误,21,4. 双重指针(指针的指针) 双重指针是指向指针的指针。其定义的格式为: 类型说明符 * 指针名=初始化; 设有如下程序段: int i=5,*pi,*ppi; pi=&i; ppi=π,22,4.2.6 动态内存分配 1. new运算 格式:new 类型(初值); 或 new 类型下标表达式; 作用:申请一个或连续申请多个“类型”所代表的内存空间,支持以括号()的形式给出初值(仅限单个申请时),运算结果为所取得空间的首地址,若申请失败返回空指针NULL。 如: int *p; p=new int(5); 动态地申请1个int型空间,即4字节,并赋初值为5。 int *q=new int5; 动态地申请连续5个int型空间,共20字节。,23,2. delete运算 格式:delete 指针; 或 delete 指针; 作用:释放“指针”所指向的内存空间,若为数组空间则加方括号。 如: delete p; delete q;,24,4.3 结构体,4.3.1 结构体的定义 格式:struct 结构体名 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; ; 作用:定义一个由多个不同类型的数据组合在一起而构造出的新类型。成员的类型也可以又是一个已有的结构体类型。,25,商品: struct Goods int ID; char name10; float price; int count; ;,26,4.3.2 结构体类型的使用 #include struct Goods int ID; char name10; float price; int count; ;,27,void main( ) Goods list5; coutlisti.IDlisti.pricelisti.count; cout“产品清单如下:“endl; cout“IDt品名t单价t数量“endl; for(i=0;i5;i+) coutlisti.ID“t““t“ listi.price“t“listi.countendl; ,28,程序运行结果: 输入产品ID 品名 单价和数量,以空格分隔 1 apple 1.5 10 2 pear 2.5 20 3 peach 5. 30 4 grape 2.5 30 5 banana 2. 30 产品清单如下: ID 品名 单价 数量 1 apple 1.5 10 2 pear 2.5 20 3 peach 5 30 4 grape 2.5 30 5 banana 2 30,29,4.4 自定义类型及枚举,4.4.1 typedef声明 格式:typedef 已有数据类型名 别名1,别名n; 作用:为已有数据类型取一个或多个别名。定义一个由多个不同类型的数据组合在一起而构造出的新类型。成员的类型也可以又是一个已有的结构体类型。 新类型可以与原类型一样地使用,如: typedef double area,radius; radius r1=1.5,r2=2.8; area A1,A2; A1=3.14*r1*r1;,30,#include typedef struct int id; char name8; Team,*pTeam; void main( ) Team x2; pTeam p=x;,31,for(int i=0;; cout“nID t NAME“endl; for(i=0;i2;i+) coutxi.id“ t “endl; coutyi.id“ t “endl; ,程序运行结果: Zhang Wang ID NAME 0 Zhang Zhang 0 Zhang 1 Zhang,32,4.4.2 枚举类型 格式:enum 枚举类型名枚举元素列表; 作用:定义一个数据类型,该类型变量的可能取值均已穷尽于枚举元素列表中。 例如 enum yearspri,summ,autu,wint; 就定义了一个表示“年”的枚举类型,该类型的所有变量只能取得spri(春)、summ(夏)、autu(秋)、wint(冬)。,33,1. 枚举元素是常量,不能修改。 如 spri=2;是错误的。 2. 枚举元素有整数形式的默认值。默认值一般从0开始依次向上递增,以此类推。 如 enum year1spri=1,summ,autu,wint; spri,summ,autu,wint所对应的值分别为1、2、3、4。 3. 不能直接将整数赋值给枚举变量。,34,#include void main(void) enum weekSun,Mon,Tue,Wed,Thu,Fri,Satw; int x; coutx; w=week(x);,35,switch(w) case Mon: case Tue: case Wed: case Thu: case Fri: cout“Its Work day!“endl;break; case Sat: case Sun: cout“Its Holiday!“endl;break; default: cout“Its outside of the week!“endl; ,36,4.5 引用,4.5.1 引用的概念 引用就是某一变量的一个别名,对引用的操作与对变量操作完全一样。 引用的声明方法: 类型标识符 &引用名=目标变量名; 如:int a; int &ra=a; /ra是变量a的引用。 说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。,37,(3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。 ra=1; 等价于 a=1; (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。 (6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论