第7章 结构体、共同体和

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7章 结构体、共同体和枚举类型 章 结构体、 7.1 结构体
结构体是一种构造数据类型,它能使一定数 量的不同类型的数据组合在一起,作为一个整体 来使用同一内存块。 例如:描述一个学生的基本信息,学号、姓 名、性别、年龄、成绩等。
1
7.1.1 结构体类型的定义 要定义结构体变量,必须先定义结构体类型。 定义结构体了类型的一般格式为: struct 结构体类型名 { 类型名 成员1; 类型名 成员2; …… };
3
7.1.2 结构体变量的定义 结构体变量的定义形式有3种: ⑴ 不指定结构体类型名,直接在定义结构体类型时说明 变量,这种结构体类型只能使用一次。使用这种形式说 明的变量,不管其成员数据是否相同,不是同一语句说 明的变量不能看成相同类型的变量。 例:struct { int a, b ; } st1,st2 ; struct { int a, b ; } st3 ;
20
7.3 枚举类型
枚举类型是一种用户定义的新的数据类型,在该类 型 中,有序地列举了该类型的变量的所有可能的取值。 7.3.1 枚举类型的定义 定义方法:
enum 枚举类型名 { 枚举常量1,枚举常量2,… ,枚举常量n}; 例如: enum week {sum,mon,tue,wed,thu,fri,sat}; 其中,每个枚举常量对应一个整数值作为序号,他们依次是0, 1,…,n-1。用户也可以自己为枚举常量确定对应的序号。 enum week{sun=7,mon=1,tue,wed,thu,fri,sat};
21
7.3.2 枚举类型变量的定义
定义了枚举类型后,我们就可以通过定义的枚举类型来说明 此类型的变量,其说明形式类同于结构体类型,也有如下几种形式: 1、不指定枚举类型类型名,直接在定义枚举类型时说明变量,这种 、 枚举类型类型只能使用一次。 enum { red , yellow , blue , green } a, b ; 2、先定义枚举类型,然后再定义此类型的变量。这种形式的枚举类 、 型可以重复用来定义同类型的变量。 enum COLOR { red , yellow , blue , green }; COLOR a, b; COLOR c, d; 3、定义枚举类型的同时也可以说明变量,并且在其它语句中还可以 、 说明同类型的变量。 enum COLOR { red , yellow , blue , green }a, b; COLOR c , d ; 22
8Baidu Nhomakorabea
假设有下列结构体类型定义: Struct st { char ch; int i; float f; }; 对于结构体类型struct st在内存中占有多少字节呢?
9
7.1.4 结构体变量的引用 结构体变量不能整体引用,只能引用变量成员。 引用方式: 结构体变量名.成员名 其中,“.”为成员运算符,它的结合性是从左向右。 例如:st1.num 表示引用了结构体变量st1的num成 员 注意: (1)同类型的结构体变量可以相互赋值。 (2)若结构体类型存在嵌套时,对变量的成员需逐级引 用。 例:st1.point.english
5
• 注意: 注意: (1)结构体类型与结构体变量概念不同。系统 并不为结构体类型分配内存,因此,不能对结 构体类型进行赋值等运算;结构体变量是占用 系统内存的,也可对结构体变量进行赋值等运 算。 (2)结构体类型变量的作用域与一般变量的作 用域相同。
6
7.1.3 结构体变量的初始化 对结构体变量初始化的方法是使用花括号将每个成员的 值括起来进行赋值。 例如:struct student { char num[10]; char name[20]; char sex; int age; float score[5]; }; 下面对结构体变量的初始化语句都是正确的: (1)struct student st1={“001”,”wang”,’f’,18,{96,86,88,62,53}}; (2)struct student st2=st1;
16
7.2.2 共同体变量的定义和初始化 共同体变量的定义和结构体变量的定义相似。 常用的形式: union 共同体名 共同体变量表; 可细化成3种:一是在定义共同体类型的同时声明 共同体变量;二是使用无名共同体类型声明共同体变 量;三是用共同体类型声明共同体变量。 例如: (1) union work { char ch[10]; int i; }x={“teacher”}; //声明1个共同体变量x,并初始化
12
(3) 结构体数组元素的引用 由于结构体数组元素相当于一个结构体变量,因 此前面讨论的关于引用结构体变量的方法也适用于结 构体数组元素。 引用方式: 结构体数组名[下标].成员名 例如:stud5[0].num引用了stud5的第1个元素的成员 num。 注意:结构体类型的变量作函数的参数时,可以将结构 体变量整体用作函数的参数,但其实参的调用不 同于数组,它属于值调用,并且实参与相应的形 参必须是同一类型的结构体变量。
17
(2)union { int i; char ch[10]; }y={12}; //用匿名共同体类型声明1个共同体变量y (3)union work { char ch[10]; int i; }; work z={“worker”}; //用共同体类型work声明1个共 同体变量z
18
共同体变量和结构体变量的重要区别是: 共同体变量内的所有成员共用同一个存储 区 域,其存储区域的大小由占用最大存储区的成 员所决定。结构体变量内的成员占用不同的存储 区域,其存储区域的大小是所有成员所占存储区 域之和。
4
⑵ 先定义结构体类型,然后再定义此类型的变量。这
种形式的结构体类型可以重复用来定义同类型的变量。 例:struct STU{ int a, b ; }; STU st1,st2 ; STU st3 ; st1,st2,st3属于同类型的变量。 ⑶ 定义结构体类型的同时也可以说明变量,并且在其它 语句中还可以说明同类型的变量。 例:struct STU{ int a, b ; } st1,st2 ; STU st3 ; st1,st2,st3属于同类型的变量。
13
7.2 共同体
共同体(也叫联合体)是C++的一种构造数据类型, 也是一种由用户自己定义的数据类型,共同体和结构体 有许多相似之处:由若干种数据类型组合而成,组成共 用体数据的若干个数据也称为成员。但与结构体不同的 是,共同体数据中所有成员占用相同的内存单元,因此 变量中的所有成员的首地址相同,变量的地址就是该变 量成员的地址。
2
• 注意: 注意: (1)结构体是一种数据类型,定义结构体时系 统并不会给成员分配内存。只有定义这个结构体 类型的变量时,才分配内存。 (2)已经定义的结构体类型为用户自定义的数 据类型,可用来说明变量、数组等。 (3)结构体类型的定义是可以嵌套的,即某个 结构体成员的类型可以是另一个已定义的结构体 类型。
14
7.2.1 共同体的定义 定义共同体的格式: union 共同体名 { 类型标识符 成员名1; 1 类型标识符 成员名2; …… };
15
例如: (1)union unioncif //定义了一个包括3个成员的共同体 { char ch; int i; float f; }; (2)union //定义了一个包括3个成员的匿名共同体类 型 { char ch; int i; float f; };
10
7.1.5 结构体数组 (1)结构体数组的定义 元素类型为结构体的数组称为结构数组。定义结构 数组的方法与定义结构体变量的方法类似。 例如: struct student { int num; char name[20]; }stud4[10]; student stud5[10]; 定义了两个包含有10个元素的结构体数组stud4、 stud5。
7.3.3 枚举类型变量的运算和使用
(1)赋值运算 ①同类型变量间的赋值。 ②也可将枚举常量表中的某一枚举常量赋给枚举变量。 例如: enum COLOR { red , yellow , blue , green } a ; COLOR b; b = a; a = red; a = COLOR (3) ; // 不可以a = 3 (2)关系运算 关系运算是在同类型变量间进行的,比较的是变量所取的枚举 常量的序号。 (3)输入和输出 枚举类型变量是不能直接从键盘输入的,但可以直接输出,输 出值为变量所取的枚举常量的序号。
23
19
7.2.3 共同体变量的使用 共同体变量的引用方式: 共同体变量名.成员名 由于任一时刻共同体变量只有一个成员存在,所以引 用时应特别注意。 7.2.4 共用体类型数据的特点 1. 在每一瞬时内存段只能存放其中一种,而不是同时存放 几种。 2. 共用体变量中起作用的成员是最后一次存放的成员 3. 共用体变量的地址和它的各成员的地址都是同一地址 4. 共用体类型可以出现在结构体类型定义中,也可定义共 用体数组,反之也成立
7
如果结构体类型的成员又是一个结构体,其变量的初 始化形式同样是在说明变量时给出成员列表或通过同类 型的变量整体赋值。 例:struct SCORE { float english, maths ; }; struct STUDENT { int num ; char name[10] ; SCORE point ; } st1 = { 10, “WangFang”, 90, 95 } ; STUDENT st2 = st1, st3={ 20, “ChangHua”, { 89, 92 } } ;
11
(2)结构体数组的初始化 对结构体数组初始化的方法与一般数组初始化方式 类同,只是由于结构体数组的每个元素都是结构体, 因此要将一个元素的所有成员值放在一个花括号中, 以便区分每个元素。 例如: struct student { int num; char name[20]; }stud6[10]={{123,”zhang”},{456,”lee”}};
相关文档
最新文档