C 课件 第七章 结构体共同体和枚举.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/4/18
Visual C++程序设计
21
【例】以下程序的运行结果是什么?
union u_type { int i; char ch[6]; long s; };
考虑将A行改为: char ch[8]
// A 或 char ch[10] 或 char ch[12]
struct st_type
char name[8];
float score;
四:结构成员的访问
};
student stu1;
cin>>stu1.No;
cout<<stu1.name;
stu1.score=89.5;
2020/4/18
Visual C++程序设计
11
结构体类型变量本身也可参与一些运算:
1) 同类型的结构体变量可以相互赋值。
“;”, 最后一个成员可省略“,”。
初始化时可以赋负数, 以后的标识符仍依次加1。
枚举元素可以作为整型常量使用,可以直接输出。 如:enum color{Red,Green,Blue};
cout<<Green<<endl; //此时结果为1
可以用枚举类型说明枚举类型变量,而且也有与结 构体类型类似的三种说明方法。
4
由于定义结构类型只是定义了一种数据类 型,因此,当编译器编译结构体的定义时, 并不为结构体中的成员分配任何内存空间, 从而在定义结构体的成员时,不能指定成员 的存储类型为auto、register、extern,但 可以指定结构体成员的存储类型为static, 其特点和作用将在以后介绍。
2020/4/18
在说明结构体数组时,可对它进行初始化,其 方法与数组类似,有两种方法:第一种方法是将 数组的每一个元素的成员的值用花括号括起来, 再将数组的全部元素值用一对花括号括起来;第 二种方法是在花括号内依次列出各个元素的成员 值。
【例7.3】
2020/4/18
Visual C++程序设计
13
结构体类型的静态成员
在说明枚举类型变量时,也可对它进行初始化,此 时可将某一个枚举元素作为它的初始值。
2020/4/18
Visual C++程序设计
26
通常将某个枚举元素赋给枚举类型的变量, 但也可将相应的整数赋给枚举类型的变量,不 过此时一定要进行强制类型转换。不过,可以 将枚举变量或枚举元素直接赋值给整型变量。
如:enum color{Red=5,Green,Blue}; ......
2020/4/18
Visual C++程序设计
9
结构体类型变量的使用
对结构体变量的使用一般是通过对其成 员的引用实现的。使用结构体变量的成员 的一般格式为:
<结构体变量名>.<成员名> 其中,“.“是结构体成员运算符
2020/4/wenku.baidu.com8
Visual C++程序设计
10
struct student
{ int No;
{ int No;
char name[8]; float score; };
student stu1={9601, ”张三“, 96.5}; student stu[2]={{9601, ”张三“,96.5} ,{9602,” 李四“,80}};
或者
struct student
{ int No;
char name[8]; float score;
一种称为结构体的数据类型,可以用来描述这 种类型的数据集。
结构是由基本数据类型构成的、并用一个标 识符来命名的各种变量的组合。结构中可以使 用不同的数据类型。结构通常用来定义存储在 文件中的记录。
2020/4/18
Visual C++程序设计
3
一:结构的定义
结构是一种派生类数据类型,在使用结构
变量之前须先对结构进行定义。定义结构的一
2020/4/18
Visual C++程序设计
20
共用体成员的引用 同结构一样,可使用成员运算符
“ .”。但值得注意的是,在同一个时候 只能引用一个成员,引用当前成员,其它成 员的值会被覆盖。
只能对共同体变量的第一个成员初始化, 不能对整体初始化。
由于共同体中的成员占用同一个内存空间, 该存储空间的大小为占用存储空间最大的成员所 占用的字节数。另外,在使用一个共同体类型变 量的成员之前必须先指定该成员的值。
般格式为:
struct 结构名
{ 类型 变量名;
类型 变量名;
... };
结构名是结构的标识符不是变量名,花括号
内的变量称之为结构的成员,类型可以是我们以
前所学到的任意类型,甚至可以是结构但不能是
结构本身,每个成员的类型可以不一样。
注意:每一个结构定义必须以分号结束!
2020/4/18
Visual C++程序设计
2020/4/18
Visual C++程序设计
19
定义共同体类型的一般格式为:
union <共同体名>{ <类型名> <变量名1>; <类型名> <变量名2>; …
};
共同体类型变量的说明方法与结构体类型 变量的说明方法类似,也有三种方法。
一般情况下我们把结构和共同体定义在 程序开头,然后在函数内定义结构变量和共 同体变量。
14
编译系统一开始就为结构体的静态类型成员分配 内存空间,并进行初始化。但在结构体中说明的静 态成员属于引用性说明,在这里并不会为其分配内 存空间,因此必须在文件作用域的某一个地方进行
定义性说明,而且仅能说明一次。定义性说明的一
般格式为:
<类型><结构体类型名>::<静态成员名>;
其中<类型>与该静态成员的类型一致,符号“::”
enum string{x1, x2, x3, x4} x;
当定义改变成: enum string { x1, x2=0, x3=50, x4 }x;
则x1=0, x2=0, x3=50, x4=51
2020/4/18
Visual C++程序设计
25
注意: 枚举中每个成员(标识符)结束符是“,”, 不是
第 章 结构体、共同体和枚 举类型
2020/4/18
Visual C++程序设计
1
结构体
2020/4/18
Visual C++程序设计
2
数组中的每一个元素属于同一种数据类型,利
用数组处理大量的同类型 数据是很方便的。但是
在实际应用中,常常需要把不同类型而关系又非常 密切的数据组织在一起,形成一个整体,以便于统 一管理。
例如表示星期的 SUNDAY, MONDAY, TUESDAY,
WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个
枚举。
枚举的说明与结构和共同体 相似, 其形式为:
enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], ... 标识符[=整型常数],
} 枚举变量;
(2) 可以定义一个无名的位域成员,表示跳过 若干个二进位。
(3) 可以定义位数为0的位域成员,表示其下 一个位域成员从下一个存储单元开始,此时该位 域的位域名必须为空。
2020/4/18
Visual C++程序设计
17
(4)一个位域成员的长度不能大于一个存储单元 的长度(32位)。
(5)位域变量的使用方法与结构体变量的使用方 法完全一样。
如果枚举没有初始 化, 即省掉"=整型常 数"时, 则从第一个标 识符开始, 顺次赋给 标识符0,1,2, ...。 但当枚举中的某个成 员赋值后, 其后的成 员按依次加1的规则确 定其值。
2020/4/18
Visual C++程序设计
24
例如下列枚举说明后, x1, x2, x3, x4的 值分别为0, 1, 2, 3。
注意,初始值表中的数据类型必须与结构体 中对应元素的类型一致(兼容的除外),否则会 产生编译错误。另外,初始值表中的数据的个 数不能大于结构体中元素的个数。
在定义结构体类型的变量时,也可以指定变 量的存储类型。
2020/4/18
Visual C++程序设计
7
三:结构变量的初始化
struct student
2020/4/18
Visual C++程序设计
16
位域类型变量的使用方法与结构体类型变量的 使用方法完全相同。
(1) 在一个结构体中定义的任一个位域都必须 在同一个存储单元中(4个字节共32位)。如果本 存储单元中剩余的二进位不够定义一个位域成员 时,则该存储单元的剩余的二进位不用,而从下 一个存储单元开始。
个区域,则每一个区域称为一个位域。位域通常用于
表示较小范围内的数。
定义位域的一般格式为:
struct <结构体名>{ unsigned <位域名1>:<二进位数>; unsigned <位域名1>:<二进位数>; …
};
位域名可以省略。位域名后的<二进位数>,可为0 或正整数,表示相应的位域所占用的二进位数。
20
{ u_type u;
float score[3];
};
void main()
{cout<<sizeof(struct st_type)<<endl;
}
2020/4/18
Visual C++程序设计
22
枚举类型(enum)
2020/4/18
Visual C++程序设计
23
枚举是一种自定义类型,一个用标示符表示的 整型常数的集合, 枚举在日常生活中很常见。
color c=Blue; 此时, 枚举变量c实际上是7,即
cout<<c<<endl; 的结果为7而不是Blue! 但:
color c=7;r
应该:color c=(color)(7); a 可以:int a=c; 或 int a=Blue; a
2020/4/18
Visual C++程序设计
27
例:定义一个描述三种颜色的枚举类型 (Red,Green,Blue),输出这三种颜色的全部排列组合。
Visual C++程序设计
5
二:结构变量的定义
声明结构变量与声明其它类型变量类似,格式为:
struct 结构名 结构变量名;
如: struct student
{ int No;
char name[8]; float score;
};
student stu1,stu2 ,stu[30];
也可在定义结构的同时定义结构变量,如:
2) 结构体类型变量不能直接进行输入输 出。
3) 结构体类型变量可以作为函数的参数, 函数的返回值也可以是结构体类型。当函数 的形参与实参为结构体类型的变量时,其结 合方式属于值传递方式。
【例7.2】
2020/4/18
Visual C++程序设计
12
结构体数组
定义结构体数组的方法与定义结构体类型变量 的方法类同,只是在定义时增加维数的说明,也 有三种方法。
在定义结构体类型时,可以把某一个成员的存 储类型声明为静态的,这样,在这种结构体类型 的所有变量中,编译系统只为该静态成员分配一 个存储空间,即这种结构体类型的所有变量的静 态成员的值都相同,只要改变了其中一个变量的 静态成员的值,其它变量的该成员的值也随之改 变。
【例7.5】
2020/4/18
Visual C++程序设计
}stu[2]={{9601, ”张三“, 96.5} ,{9602,”李四
“,80}};
2020/4/18
Visual C++程序设计
8
对于结构体类型的变量,在编译过程中,编 译系统将为这些变量分配相应的内存空间,所分
配的空间大小原则上为结构体中所有成员所占空
间的总和。
结构体变量也存在作用域的问题,其作用域 与一般变量的作用域相同。
struct student
{ int No;
char name[8]; float score;
2020/4/18
}stu1, stu2, stu[30];
Visual C++程序设计
6
与基本数据类型类似,在定义结构体类型的 变量时,也可对该变量进行初始化,其方法与 对数组的初始化方法类似,即采用用花括号括 起来的初始值表。
(6)同一个存储空间中位域的分配方向随机器而 异。
(7)当要存入一个成员中的数超过它所能表示的 范围时,超过的高位将被去掉。
(8)位域的优点是可以节省存储空间,但在存取 位域变量时,花费的时间较多。
2020/4/18
Visual C++程序设计
18
共同体
与结构一样,共同体也是一种派生类 数据类型,但是其成员共享同一存储空间, 即成员公用一个内存位置,可在不同的时 间保存不同的数据类型和不同长度的变量。
称为作用域运算符,它表示成员与结构的一种隶属
关系。
静态成员可以脱离具体结构体变量而存取,即可 以利用结构体名和作用域运算符表示该成员。
在用初始值表对结构体变量初始化时,不再对静
态成员置初值,即初始值表将跳过静态成员。
2020/4/18
Visual C++程序设计
15
* 位域
如将一个字或一个字节以二进位为单位划分为若干