- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 联共用体和枚举类型
第11章 联合共用体和枚举类型
前面讨论的结构体是由若干个不同数据类型的成员所组成的一种构造数据类型,它的每一个成员都占用一定的内存空间。在实际使用中,组成构造类型的数据成员在其生命期的每一个时刻往往只需一个成员在内存中,为此,C语言系统本着从节省内存的角度出发,提供了一种称为联合共用体的构造数据类型。
11.1 联合共用体
联合共用体又称共用体或联合体,它与结构体一样,也是C语言提供的一种构造数据类型,而联合共用体中各个成员不占用专门的内存空间,全体成员共用一块内存空间。也就是说任何时刻,联合共用体的存储单元中只能存放它的一个成员的数据,而不同的时刻可以存放不同成员,甚至是不同数据类型的成员。所谓的联合共用体就是指各成员联合起来共同占用一块内存存储空间。联合共用体和结构体的存储比较如图11-1所示。
结构体
struct student {
int num;
char name[8];
float score;
};
联合共用体
union student {
int num;
char name[8];
float score;
};
由此可见,“共用存储区域,每次只能放入它的一个成员”的特征是联合共用体与结构体的惟一区别。只要牢记这一特征,我们就不妨把联合共用体看成是结构体的特例。只要不与这个特征发生冲突,结构体中能使用的处理手段都可以在联合共用体中使用。
联合共用体类型的声明与结构体类型的声明非常相似,例如:
union联合共用体类型名 {
类型 成员名1;
类型 成员名2;
…
};
联合共用体变量的定义也与结构体变量的定义非常相似,例如:
union data {
int a;
char b;
float c;
} x, y, z;( /* 声明联合共用体的同时定义联合共同体变量x,y,z */
union data n, m, r;( /* 定义联合共用体变量n,m,r */
或者:
union {
int a;
char b;
float c;
} x, y, z; /* 匿名定义联合共同体变量x,y,z */
前一个声明了类型名,又定义了变量;后一个没声明类型名,只定义了变量。
联合共用体变量成员的引用与结构体一样,可以使用“成员名点记法”(即运算符“.”)和“成员名指向法”(即运算符“-(”)两种形式。
例11.1 联合共用体变量成员的引用。
#include (stdio.h(
union data {
int a;
char b;
float c;
};
void main() {
union data x, *p(x; /* 定义联合共同体变量x和联合共用体指针变量p */
x.a(2;
printf((x.a((d (, x.a);
x.b((A(;
printf((x.b(\((c\( (, x.b);
p-(c(15.6;(x.c((.2f\n(, x.c);
}
运行结果为:
x.a(2 x.b((A( x.c(15.60
注意:
(1) 不能引用联合共用体变量的整体,只能引用它的某个成员。
(2) 不能在定义联合共用体变量时对它初始化。
(3) 由于只能有一个成员驻留在联合共用体的变量存储区中,因此在引用时,必须记住当前存放在联合共用体变量中的是哪个成员,联合共用体变量中起作用的成员是最后一次存放的成员。
(4) 不能把联合共用体变量作为函数参数,也不能使函数返回联合共用体类型的值。但是,联合共用体变量的成员可以作为函数的参数,因为它的类型已不是联合共用体类型,而是该成员的类型。
例11.2 教学管理中,设立一个结构体数组,记载某学生20门课程的学习成绩报告单,结构体成员包括courseNo(课程号)、courseName(课程名)、credit(学分)、courseType(类别)和measure(评价)等,类别分为必修课(required)和选修课(selective),对于必修课以整型百分制成绩(score)进行评价,对于选修课则以字符型等级制成绩(grade)进行评价,等级制成绩分为(A(、(B(、(C(、(D(和(E(,也就是说,评价成员是由score和grade联合共用一块内存,即联合共用体。
struct schoolReport {
int courseNo;
char courseName[10];
int credit;
char courseType;
union {
int score; /* 百分制成绩,作为共用体一个成员 */
char grade; /* 等级制,作为共用体另一个成员 */
} measure; /* 评价,
您可能关注的文档
- 第04讲第七章VFP语言基础.doc
- 第05-7章 表、页、宏.doc
- 第05章 临营养治疗.doc
- 第05章 图象处理.doc
- 第05章 运算大器 教案.doc
- 第05章单元总-练习-实训-知识拓展.doc
- 第05章脂类代习题.doc
- 第06章 循结构程序设计.doc
- 第05章思考题习题解答.doc
- 第06章 中期告和分部报告20100919.doc
- 职业技术学院2024级工业机器人技术(安装与维护)专业人才培养方案.docx
- 职业技术学院2024级应用化工技术专业人才培养方案.pdf
- 职业技术学院2024级软件技术(前端开发)专业人才培养方案.pdf
- 职业技术学院2024软件技术专业人才培养方案.docx
- 职业技术学院2024级信息安全技术应用(安全运维)专业人才培养方案.docx
- 职业技术学院2024级新能源汽车检测与维修技术(车辆鉴定与评估)专业人才培养方案.pdf
- 职业技术学院2024级石油炼制技术专业人才培养方案.pdf
- 职业技术学院2024级环境监测技术专业人才培养方案.docx
- 职业技术学院2024级汽车制造与试验技术专业人才培养方案.pdf
- 职业技术学院2024级信息安全技术应用专业人才培养方案.pdf
文档评论(0)