C语言共用体及其它数据类型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
teacher
Class\ Position
11.1 共用体
分析: (1)学生和教师都属于复杂数据,应该定义为结构 体类型。 (2)如果将学生和教师分别存放在不同的表格(即 结构体数组)中,可以定义两个不同类型的结构体数 组。 (3)如果将学生和教师存放在同一表格(即结构体 数组)中,可将“班级”和“职务”作为两个成员。 但这样一来,对于学生,“职务”成员就闲臵了,对 于教师“班级”成员就闲臵了,从而导致存储空间的 浪费。最好的解决办法就是使“职务”和“班级”占 据同一存储单元,对于教师,在该存储单元写入其 “职务”,对于学生,在该存储单元写入“班级”。 也就是说,定义一个共用体类型的变量。
11.1 共用体
11.2 枚举类型
在处理实际问题时,常常要涉及到一些非数值性 数据,而这些数据难以用前面介绍的标准类型准确描 述,只好采用一些替代方法。 例如:
·性别有男女之分,用整数0、1分别表示; ·红、橙、黄、绿、青、蓝、紫七种颜色,用1、2、 3、4、5、6、7分别表示;
·一周有七天,以0、1、2、3、4、5、6分别表示; 一年有12个月,用1~12分别表示。
78 56 34 12
三. 共用体变量的应用
【例11-2】设有若干个人员的数据,其中有学生和教 师。学生数据包括:姓名、号码、性别、职业、班级。 教师数据包括:姓名、号码、性别、职业、职务;如 表11-1所示。要求输入人员数据,然后输出。
Name Li
Wang
Num 2041
1986
Sex F
M
job Student
11.1 共用体
(2)定义类型时同时说明变量,例如: union data { int i; char ch; float f; }a,b,c; (3)不定义类型名而直接定义变量,例如: union { int i; char ch; float f; }a,b,c;
11.1 共用体
二. 共用体变量的引用方式
11.2 枚举类型
显然,这种用数值代码来代表某一具体非数值数据的方 法在程序设计中属于个别约定,虽可采用,但使用起来有诸 多的不便: 一方面这种描述方法不易明确数据与代码的对应关系, 不直观,可读性差; 另一方面,这些数值代码的整数形式容易混淆其真实含 义,对这些数字代码进行的某些语法正确的运算,可能毫无 意义,更可能导致不必要的错误。
定义的标识符,一般是所代表事物的名称,但这些标 识符并不自动地代表事物本身。
例如 enum color{red,blue,green,black};
11.2 枚举类型
2. 枚举类型是有序类型
一般地,枚举类型中各枚举元素按定义时的先后次序分别 编号为0、1、2、...、n-1。 例如: red<blue 值为真,各枚举元素可根据其序号进行大小比较和相应的运算 green-red 值为2 用户可根据需要在定义时直接指定某一枚举元素的编号, 从而改变量系统默认的编号。例如: enum week {sun=7,mon,tue=2,wed,thu,fri,sat}; 则sun的序号为7,mon的序号为8, tue的序号为2, wed 的序号为3, thu的序号为4,fri的序号为5,sat的序号为6。 11.2 枚举类型
data_struct为结构体名,它有6个成员,如第 一个成员f1是一个无符号的整数,其后的“:1” 表明该成员占据1“位”的存储空间。 这种方法的好处在于对压缩的数据值存取可采 用结构成员方法,这样做起来方便。
定义一个新的类型名的基本方法是: (1)先按定义变量的方法写出定义体(如:int i;)。 (2)在最前面加typedef(如:typedef int i)。 (3)将变量名换成新类型名(如:将i换成COUNT,即 typedef int COUNT)。 (4)然后可以用新类型名说明变量.
11.3 typedef
它只是对已存在的类型创建了一个新的称呼,即新 的类型名。 创建这个新的类型名可能是为了使类型名的引用更 简单、方便(如对结构体、共用体等创建新的类 型),也可能是为了使类型名的引用更符合某些人 的习惯和喜好
在程序中,用户可以同时使用原有的类型名和新创 建的类型名来定义变量。
11.3 typedef
例如: typedef int INTEGER; typedef float REAL; 指定用INTEGER代表int类型,REAL代表float 。 这样,以下两行等价: int i,j; float a,b; INTEGER i,j; REAL a,b;
二. 枚举类型的应用
1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量 enum week{sun,mon,tue,wed,thu,fri,sat};
enum week weekday,workday;
◆定义枚举类型的同时定义枚举变量
enum color {red,blue,green,black}a,b,c;
第11章 共用体及 其它数据类型
11.1 共用体 11.2 枚举类型
11.3 用typedef定义类型 11.4 位段结构
11.1 共用体
一. 共用体的概念
当需要把不同类型的变量存放到同一段内存 单元,或对同一段内存单元的数据按不同类型处 理,则需要使用“共用体”数据结构。
共用体数据类型是指将不同的数据项组织为 一个整体,它们在内存中占用同一段存储单元。
11.2 枚举类型
11.3 用typedef定义类型
C语言允许用typede定义新的类型名来代替已有的类 型名。 用typedef定义新类型的一般形式为:
typedef 类型标识符1
类型标识符2;
标准类型或用户 已定义标识符
11.3 typedef
新的类型的 标识符
用typedef定义了一个新的类型名,但它并没有创建 类型。
ຫໍສະໝຸດ Baidu
11.4 位段结构
位段(又称为位域)是一种特殊的结构体成员或共用 体成员(它只能用在结构体或共用体中),它通过指 定成员在内存存储时占用的位数(二进制位),使数 据在内存的存储更为紧凑。
位段结构定义的一般形式为: struct/union 位段名 { unsigned <成员1>:<二进制位数>; unsigned <成员2>:<二进制位数>; ┇ unsigned <成员n>:<二进制位数>; };
if(today==sun ||today==sat) { printf(” today is rest\n”);return;} else printf(”today is workday\n”); for(weekday=today;weekday<=fri;weekday++) /*间接输出工作安排表*/ switch(weekday) {case mon:printf(”mon-study computer\n”);break; case tue:printf(”tue-study math\n ”);break; case wed:printf(”tue-study english\n ”);break; case thu:printf(”thu-study music\n ”);break; case fri:printf(”fri-study chemistry\n ”);break; } }
枚举类型是ANSI C新标准所增加的,它是C语言 中的简单类型而非构造类型,它的值域是有穷的, 可以一一列举出来,变量的取值只限于列举出来的 值的范围。 所谓枚举,是将具有相同属性的一类数据值一一 列举。
11.2 枚举类型
一. 枚举类型的定义
1. enum 枚举类型名 {标识符1,标识符2,…,标识符n}; ★enum是枚举类型定义的关键字 ★枚举类型名是用户命名的标识符,它与enum构成枚 举类型的标识符 ★花括号中“标识符1,标识符2,…,标识符n”是 所定义枚举类型的全部取值,通常称这些标识符为 “枚举元素“或“枚举常量”。这些标识符是用户
【例11-3】利用枚举类型表示一周中的每一天,要求 输入今天是星期几,判断今天是是工作日还是休息日, 并输出今天起直到星期五的工作安排。
分析: (1)为了直观性,定义星期的枚举类型。 (2)利用间接的方法输入枚举类型的星期几, 即用数字代码分别表示不同的一天,例如0代表星期 日,1代表星期一,...。 (3)判断今天是工作日还是休息日,工作日从 星期一至星期五。 (4)用间接的方法输出工作安排表。
11.1 共用体
1. 共用体类型定义
共用体类型定义的一般形式: union 共用体名 { 成员表列 };
2000 ch i f
例: union data { char ch; int i; float f; };
2001
2002 2003 11.1 共用体
覆盖技术
2. 定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i; char ch; float f; }; union data a,b,c;/*共用体类型变量定义*/
◆直接定义枚举变量 enum {male,female}sex1,sex2;
11.2 枚举类型
2.枚举变量的输入/输出
枚举变量的值不能直接输入/输出
要输入性别: printf(”enter male(0),female(1):”); scanf(”%d”,&sex_dm); switch(sex_dm) {case 0:sex1=male; break; case 1:sex1=female;break; } 要输出某人的性别: switch(sex1) {case male: printf(”\n male”); break; case female: printf(”\n female”);break; } 11.2 枚举类型
对共用体变量的引用,是通过其成员的引用 来实现的。
a.i /*引用共用体变量中的成员i,a.i就相当于一个整型变量*/ a.ch /*引用共用体变量中的成员ch,a.ch就相当于一个字符变量*/ a.f /*引用共用体变量中的成员f,a.f就相当于一个实型变量*/
不能对共用体变量进行整体的输入输出,例如: printf(”%d”,a);
11.1 共用体
【例11-1】共用体变量引用。 #include <stdio.h> void main() a 61 56 b {union{ 00 76 char a; b 00 00 int b; 00 00 long c; }uu; uu.a=’0x61’; printf(”\n1:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); uu.b=0x7656; printf(”\n2:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); uu.c=0x12345678; printf(”\n3:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); } 11.1 共用体
11.3 位段结构
struct data_struct {unsigned int unsigned int unsigned int unsigned int unsigned int unsigned int };
f1:1; f2:1; f3:1; opcode1:3; opcode2:4; opcode3:6;
11.2 枚举类型
#include <stdio.h> void main() { enum days{sun,mon,tue,wed,thu,fri,sat} today,weekday; int day; printf(”enter today(0~6):”); scanf(”%d”,&day); switch(day) /*间接输入今天是星期几*/ { case 0:today=sun;break; case 1:today=mon;break; case 2:today=tue;break; case 3:today=wed;break; case 4:today=thu;break; case 5:today=fri;break; case 6:today=sat;break; } 11.2 枚举类型
相关文档
最新文档