《C语言用户自定义数据类型.pptx》由会员分享,可在线阅读,更多相关《C语言用户自定义数据类型.pptx(84页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、18.1.1结构类型的定义一.结构类型的概念 前面的我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址、员工信息等。其数据类型可能由性质不同的成员组成。第1页/共84页2结构类型的概念numbernameSexdepartmentagewage1wage29008806Li FangFInformatio188507809008807Lin HongFPersonnel1690076090088
2、08Wu QiangMTechnical189507909008809Li JunMPersonnel178807609008810Zhang Xia FTechnical17870795l上表中数据是由员工的工作证号(number)、姓名(name)、性别(sex)、年龄(age)、部门(department)、工资(wage)等数据项组成的,逻辑上相关的数据。l在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。第2页/共84页3 我们可以创建如下的结构类型:struct staff 其中staff由用户命名 char number8;char name10;
3、char sex;int age;char dep20;float wage2;以上定义了一个结构类型struct staff(与int 同地位),它包含了number、name、sex、age、dep、wage等不同类型的数据项。结构类型的概念第3页/共84页41结构体类型说明的一般形式 struct 标识符 结构成员列表;;说明:(1)struct是关键字,声明要定义一个结构类型,结构类型名用标示符命名,要“见名知义”;(2)成员列表给出n个成员声明,成员可以基本类型变量、数组,也可以是另一结构类型变量等,对每个成员必须作类型说明,成员之间用分号分隔;二.结构体类型及结构体变量第4页/共8
4、4页5l l学生的基本信息,学生的基本信息,包括包括学号、姓名、学号、姓名、性别、年龄、班级、性别、年龄、班级、成绩成绩等数据项。等数据项。l l这些数据项描述了这些数据项描述了一个学生的几个不一个学生的几个不同侧面。同侧面。nonamesexageclassnograde独立的变量:数据项之间无关联nonamesexageclassnograde数据项为一个整体数据项为一个整体struct student char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float
5、grade;/成绩第5页/共84页62.结构类型的几点说明(1)对于结构类型,系统不会为之分配内存。只有在定义了结构变量后,系统才会分配内存单元给变量。(2)结构是由若干个数据项组成,每个数据项都属于一种已有定义的类型。每一个结构成员都不是独立的,它不是一般的变量,而是跟结构联系在一起。struct Student int number char name9;int age;char sex;int age;char sex;同名的age和sex均不会有命名冲突问题第6页/共84页7(3)结构类型可以嵌套定义。所谓嵌套定义是指在一个结构类型中可以包含另一个或一些结构类型,通常用于结构类型的成员
6、是一个结构变量的场合。namebirthdaysexmonthdayyear结构类型的几点说明第7页/共84页8结构类型的几点说明struct Student char name9;struct Birthday int year;int month;int day;birthday;char sex;struct Student int number char name9;int age;char sex;第8页/共84页9(4)允许省略结构类型名,即允许定义无类型名的结构类型。struct int year;int month;int day;birthday;无名的结构类型必须后随结构变
7、量(如birthday)的定义,并且仅能一处使用,这种形式通常用于内嵌在结构类型中的结构类型。(5)可以用sizeof运算符来计算结构类型的长度(字节数)例如:printf(“%d”,sizeof(struct Student);结果为18结构类型的几点说明第9页/共84页10 1.结构类型数据对象包括一般变量、指针、数组等,对于成为结构变量、结构指针、结构数组等可以在说明语句中用已定义的结构类型定义结构数据对象,也可以在定义结构类型的同时定义结构数据对象。8.1.2结构类型数据对象的定义及初始化struct date int month;int day;int year;struct sta
8、ff char number8;struct date birthday;char sex;定义了结构类型之后,还必须定义结构类型变量,类型与变量是不同的概念。第10页/共84页112结构类型变量的三种定义方式 (1)在说明结构类型的同时,也定义了结构类型变量例如:struct book int num;char name60;float price;book1,books3;在说明结构类型名struct book的同时,定义了结构类型变量book1与结构类型数组books,数组books有三个元素:books0、books1、books2。结构类型数据对象的定义及初始化第11页/共84页12
9、(2)先说明结构类型,再单独进行变量定义例如:struct staff char name10;char sex;float wage2;.struct staff worker1,worker2;(3)省略结构标识符,直接定义变量例如:struct /*此处没有标识符*/int month;char day;unsigned year;d5;没有标识符一定要在定义结构类型的同时定义变量。结构类型数据对象的定义及初始化第12页/共84页13 定义了结构类型:struce Student 后定义不同变量的区别:struce Student s1,s2100,*s3=&s1,*s4=s2;从上面可
10、以看出:(1)s1是该类型的变量,s2是该类型的一维数组,s3,s4 是指向该类型变量的结构指针;(2)结构类型的变量名不是地址.结构类型数据对象的定义及初始化第13页/共84页143.结构类型变量的初始化可以在定义结构类型变量的同时对其初始化,其语法格式:struct 标识符 结构变量名=成员初始化值表struct Student int number char name9;struct int year;int month;int day;birthday;char sex;student1=1101,”lilin”,1985,8,1,M;第14页/共84页15 定义了结构数据对象,就可以
11、访问其中的每一个成员。结构成员可以像基本变量那样使用,如赋值、输入输出、参加表达式的计算等,这些操作统称为对结构成员的访问。1、结构成员的表示 结构变量是由n个成员聚合而成的一个整体,要访问其中的一个成员,必须同时给出整体的名称和个体成员的名称。struct Student s1,s2100,*s3=&s1;s1是结构变量,用来存放单个学生的信息 s2是结构数组,该数组包含100个类型是struct Student 的成员,这样的数组可以表示一个学生情况 s3是结构指针,存放struct Student 类型数据对象s1的内存首地址。9.1.3结构成员的引用第15页/共84页16(1)结构变量
12、成员的表示:结构变量.成员名 (如 s1.number、s1.age)(2)结构数组元素成员的表示 结构数组名下标表达式.成员名 s25.name表示s2的第六个元素(结构变量)之name成员 (3)结构指针成员的表示 结构指针-成员名(如 s3-sex)或 (*结构指针).成员名(如(*s3).sex)对于多层嵌套结构成员,有多个“”,从外向内。结构成员的引用第16页/共84页172.成员运算符 两种成员运算符:“.”和“-”3.嵌套结构的结构成员的表示 结构成员本身又是结构变量,称为嵌套结构。必须使用若干个成员运算符来连接多个结构变量及其对应的分量,逐级表示到最低一级成员,该级成员是可以直
13、接访问的基本数据对象。例如:student1.birthday表示student1中的birthday;而student1.birthday.year则表示student1中的birthday的year成员 注意:只能对最内层的成员进行存取、运算以及输入、输出等操作结构成员的引用第17页/共84页184.结构变量成员的引用 结构变量的成员可以像普通变量一样进行各种运算,如赋值、输入、输出、计算及地址操作等,例如:student1.birthday.year+;student.number=11001;scanf(“%d”,&student1.sex)将变量中的sex的地址作为参数传递给scan
14、f函数,以输入sex的值结构成员的引用第18页/共84页195、结构成员表示和引用的注意事项(1)如果成员是基本类型数据则可以直接引用;(2)在绝对多数场合(赋值运算除外),只能访问成员而不能直接访问结构本身。struct Student student1,student2 student1=student1+student1;printf(“%d,%s,%d,%cn“,student1);printf(“%d,%s,%d,%c,%fn”,student1.number,student1.name,student1.age,student1.sex);Scanf(“%d,%s,%d,%c,%f
15、”,&student1);printf(%o,student1);输出student1的首地址第19页/共84页20(3)可以将一个结构变量作为一个整体赋给另一个具有相同类型的结构变量,其作用相当于逐个对位于赋值语句左部的结构变量的每个分量赋值。如:student2=student1;等效于:student2.number=student1.number;strcpy(student2.name,student1.name);student2.sex=student1.sex;也可以把一个结构变量中的内嵌结构类型成员赋给另一个结构变量的对应得内嵌结构类型成员,例如 student2.birth
16、day1=student1.birthday1;(4)不允许将一组常量直接赋给一个结构变量。如:student2=“lili”,18,M,12,15,1978,010001,89;第20页/共84页21例8.3 试分析以下程序的执行结果:#include struct Birthday int m;int d;int y;void main()struct Student student1=1001,lili,18,M,12,15,1982,student2;student2=student1;printf(student1:%ld%s%d%c%d/%d/%dn,student1.num,st
17、udent1.name,student1.age,student1.sex,student1.birthday1.m,student1.birthday1.d,student1.birthday1.y);printf(student2:%ld%s%d%c%d/%d/%dn,student2.num,student2.name,student2.age,student2.sex,student2.birthday1.m,student2.birthday1.d,student2.birthday1.y);struct Student long num;char name10;int age;ch
18、ar sex;struct Birthday birthday1;第21页/共84页22补充例 若有以下定义,则正确的赋值语句为()。struct date2 long i;char c;two;struct date1 int cat;struct date2 three;one;(A)one.three.c=A;(B)one.two.three.c=A;(C)three.c=A;(D)one.c=A;第22页/共84页238.2结构数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前
19、介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。第23页/共84页248.2.1结构数组的定义及其应用1、结构数组的定义 结构数组是基类型为结构类型的数组。它既有结构变量的属性,又有数组的属性,这样对于成批的结构化数据,比如学生数据或职工数据,既便于表示和存储又便于采用循环语句实现重复处理。定义结构数组的语法格式:struct 标识符 数组名常量表达式;或 struct 标识符 成员表 数组名常量表达式;第24页/共84页25结构数组的定义及其应用l后定义struct child char initial;int age;int grade
20、;struct child boy30;l同时定义struct child char initial;int age;int grade;boy30;l直接定义struct char initial;int age;int grade;boy30;第25页/共84页262、结构数组的初始化Struct Student student2=1101,”lilin”,1985,8,1,M,1102,”wangjing”,1985,7,1,F;Struct Student student=1101,”lilin”,1985,8,1,M,1102,”wangjing”,1985,7,1,F;数组的下标说
21、明会省略Student0Student1结构数组的定义及其应用第26页/共84页278.2.2对结构数组的操作1、引用结构数组元素 数组名下标表达式或*(数组名+i)如:employee2、*(employee+i)2、引用结构数组元素的成员 employee4.name employee4.salary注意:(1)可以像基本变量那样使用,如赋值、输出、计算等 scanf(“%s%c”,employee0.name,&employee0.sex);(2)不能将结构数组元素作为一个整体进行输入或输出,但可以将结构数组元素作为一个整体进行赋值操作 printf(“%d”,employee0);sc
22、anf(“%d”,&employee0);employee0=employee1 第27页/共84页28对结构数组的操作struct child char initial;int age;int grade;struct child boy2=a,5,3,b,4,2;boy1.age+;printf(“%d”,boy1.age)第28页/共84页29对结构数组的操作例:struct student int num;char name20;char sex;int age;char addr30;a5;a0.num=060001;a1.name=Lin Hong;l一个结构体数组元素相当于一个结
23、构体变量,其处理方法与结构体变量的处理方法相同 第29页/共84页30对结构数组的操作例:struct student int num;char name20;char sex;int age;char addr30;a5;gets(a0.name);scanf(%c,&a0.sex);scanf(%d,&a0.age);a3=a0;printf(%s,&a3.name);第30页/共84页31对结构数组的操作3、结构数组应用实例例8.5计算学生的平均年龄#include struct student int number;char name20;int age;stu4=1011,li li
24、,21,1022,li hong,23,1023,wang ping,22,1024,zhang san,22;void main()int i=0;float ave,s=0;for(i=0;i4;i+)s+=stui.age;printf(s=%fn,s);ave=s/4;printf(average age=%fn,ave);第31页/共84页32void main()struct Device array=A,0,B,0,C,0;int i,j;char device_type;for(i=1;i=N;i+)scanf(%c,&device_type);for(j=0;j3;j+)if
25、(device_type=arrayj.type)arrayj.count+;for(i=0;i3;i+)printf(type=%c,count=%dn,arrayi.type,arrayi.count);#include#define N 10 /*设备数量*/struct Device char type;int count;例8.6第32页/共84页338.3结构和指针结构变量在内存中的起始地址称为结构变量的指针(简称结构指针)。我们可以声明一个指针变量,用来存放该地址,那么它就指向一个结构变量。引入结构指针的主要目的是实现结构变量的动态存储分配以及函数之间的双向数据传递。当然,结构变
26、量的成员也可以使指针,甚至可以是指向相同类型结构变量的指针,这是构造链表的基础。第33页/共84页348.3.1指向结构变量的指针1.定义指向结构变量的指针struct 结构体名 *结构体指针名;例 struct child *p;存放结构体变量在内存的起始地址struct child char initial;int age;int grade;boy;struct child*p=&boyinitialagegradeboyp第34页/共84页35指向结构变量的指针2.结构指针的初始化struct child char initial;int age;int grade;boy,*p1,*
27、p2;p1=&boy;p2=NULL;struct child*p=&boy;第35页/共84页363.通过指针来引用结构变量成员指向运算符优先级:1结合方向:从左向右例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).num=101(1)(*结构体指针).成员名 例如:(*p).num(2)结构体指针-成员名 例如:p-num第36页/共84页37例8.7#include#include struct Studentlong num;char name20;int
28、age;char sex;void main()struct Student student,*p;p=&student;strcpy(student.name,wang li);student.num=89101;student.age=18;student.sex=M;printf(nname:%snnumber:%ldnage:%dnsex:%cn,student.name,student.num,student.age,student.sex);printf(nname:%snnumber:%ldnage:%dnsex:%cn,(*p).name,(*p).num,(*p).age,(
29、*p).sex);printf(nname:%snnumber:%ldnage:%dnsex:%cn“,p-name,p-num,p-age,p-sex);第37页/共84页388.3.2指针变量作为结构成员#include struct Studentint number;char*name;void main()struct Student stu=1101,lili;printf(%sn,stu.name);第38页/共84页39指针变量作为结构成员#include struct Studentint number;char*name;void main()struct Student
30、stu;scanf(%d,&stu.number);stu.name=(char*)calloc(21,sizeof(char);scanf(%s,stu.name);printf(%sn,stu.number);printf(%sn,stu.name);指针变量如果没有初始化,它的指向是不确定的,也即不可用。必须调用calloc函数为其申请内存空间第39页/共84页40指针变量作为结构成员1.指针类型的成员变量要赋值时需分配内存空间2.如果变量的空间分配通过内存分配函数完成,最后还要释放这块内存区域。l介绍三个存储管理库函数,原型说明在“alloc.h”头文件中,使用包含到源程序中 动态分配
31、存储区函数malloc()函数原型:void*malloc(unsigned size);调用格式:malloc(size)功能:在内存分配一个size字节的存储区。调用 结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返回NULL(即0)。第40页/共84页41指针变量作为结构成员 动态分配存储区函数calloc()函数原型:void*calloc(unsigned int n,unsigned int size);调用格式:calloc(n,size)功能:在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则
32、返回NULL(即0)。第41页/共84页42指针变量作为结构成员 释放动态分配存储区函数free()函数原型:void free(void*p);此函数无此函数无返回值返回值 实参必须是一个指向动态分配存储区的指针,它可以是任何类型的指针变量。调用格式:free(p)功能:释放p所指向的动态分配的存储区。第42页/共84页438.3.3指向结构数组的指针 可以定义一个结构指针指向一个结构数组,也就可以利用该指针间接访问结构数组的元素。Struct A int a;float b;arr3,*p;p=arr;11.52.523.53arr0arr1arr2parr11.52.523.53arr0
33、arr1arr2parr第43页/共84页44指向结构数组的指针(1)p-a;得到p指向的结构数组元素中的成员a的值(2)(p+)-a;先得到p指向的结构数组元素中的成员a的值,然后再对p指针加1(3)(+p)-a;先让p指针加1,然后得到p指向的结构数组元素中的成员a的值(4)(p-a)+;先得到p指向的结构数组元素中的成员a的值,然后再对得到的值加1第44页/共84页45例8.9#include struct Studentint num;char name20;char sex;int age;struct Student stu2=10101,li lin,M,18,10102,zha
34、ng fan,M,19;void main()struct Student*p;clrscr();printf(No.name sex agen);for(p=stu;pnum,p-name,p-sex,p-age);第45页/共84页468.3.4结构指针作为函数参数1结构体变量作为函数的形参的三种形式:(1)以结构体变量的成员作为参数,传递结构体变量的成员的值。(2)以结构体变量作为参数,直接传递结构体变量的值。结构变量整体传送,即将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。(3)以结构体指针作为参数,传递结构体变量的地址。
35、第46页/共84页47例8.10:输出学生的姓名与年龄struct Student int num;char name20;int age;void age(struct Student*p)printf(%sn,p-name);printf(%dn,p-age);void main()struct Student stu3 =101,kiki,23,102,mimi,24,103,nana,23;struct Student*p;p=&stu0;age(p+1);第47页/共84页48例:计算三个学生的总分和平均分(利用结构指针)。main()struct stu char name10;f
36、loat score;stu3=Mary,76,John,85,Tom,81,*p=stu;int i;float sum=0;for(i=1;iscore;p+;printf(%5.2f,%5.2f n,sum,sum/3);getch();第48页/共84页49结构类型的应用例:定义一个包括年、月、日成员的结构类型变量,输入一个符合常规的日期,算出该日期是这一年中的第几天并输出。【分析】这里主要存在一个闰年问题,也就是当该年为闰年时,二月份有29天,其余为28天。判断该年是否为闰年的条件是:年份是否能被4整除,但不能100整除;或能被400整除;当然还要判断输入的日期是否有效以及各月的天数
37、情况。第49页/共84页50结构类型的应用main()struct unsigned year,month,day;x;int maxday=0,31,28,31,30,31,30,31,31,30,31,30,31;int i,n=0;/*n为天数*/do printf(请输入年 月 日:);scanf(%d%d%d,&x.year,&x.month,&x.day);if(x.year%4=0&x.year%100!=0)|(x.year%400=0)maxday2=29;while (x.year0|x.month12|x.daymaxdayx.month);for(i=1;iage (B
38、)(*+p).age (C)(*p+).age (D)*(+p)-age 第51页/共84页52课 堂 练 习3若定义如下结构,则能打印出字母M的语句是()。struct person char name9;int age;struct person class10=Wujun,20,Liudan,23,Maling,21,zhangming,22;(A)printf(%cn,class3.name);(B)printf(%cn,class2.name0);(C)printf(%cn,class2.name1);(D)printf(%cn,class3.name1);第52页/共84页538.
39、4.1联合的概念及联合类型定义1联合类型的概念:将若干个变量组织在一起,使它们能在不同的时间占用同一段内存空间,这种数据组合对应得数据类型称为联合类型或共同体类型。2.定义联合类型 union 联合类型名(union是C语言关键字)成员列表;;第53页/共84页54例如:union abc (union是C语言关键字)char ch;int i;float f;v;以上说明了一个联合类型:union abc,同时定义一个联合类型变量v。内存高地址 内存低地址符变量ch 占1字节 整型变量 i 占2字节单精度实型变量f占4字节 联合的概念及联合类型定义第54页/共84页55l 构造数据类型,也叫
40、构造数据类型,也叫共用体共用体l 用途用途:使几个不同类型的变量使几个不同类型的变量共占共占1 1段内存段内存(相互覆盖相互覆盖)union 联合体类型名 数据类型名1 成员名1;数据类型名2 成员名2;类型定义不分配内存p 联合体的大小是成员中占内存最大的成员的大小共占4字节最新存储的数据是有效的联合的概念及联合类型定义第55页/共84页56说明:(1)系统为所有联合类型成员分配同一地址开始的存储空间,使用覆盖的方式共享存储单元。例:用数组作联合类型的成员union utp1 unsigned char b2;unsigned w;r1;本例联合类型中,定义了一个数组成员b。可以用r1.b0
41、存取r1.w低字节的值,用r1.b1存取r1.w高字节的值。例如下列程序段:r1.w=0 x6141;printf(%c,%c,%un,r1.b0,r1.b1,r1.w);输出结果是:A,a,24897w4161b1b0联合的概念及联合类型定义第56页/共84页57(2)联合类型也允许嵌套定义,例如:union utp struct char low,high;b;unsigned w;r;以上在联合类型中,定义了一个结构类型成员b,如上图所示。本例中可以用r.b.low存取r.w的低字节的值,而用r.b.high存取r.w的高字节的值,也可以用r.w一次存取双字节的值。wb.lowb.hig
42、h联合的概念及联合类型定义第57页/共84页58(3)联合类型变量所占空间的大小取决于占存储空间最大的那个成员。例如上述例子中(图4.13所示),sizeof(u_type)或sizeof(v)的值均为,因为成员ch、i、f中,f占个字节的存储空间,是占空间最大的。(4)由于联合类型变量中所有成员共享存储空间,因此变量中的所有成员的首地址相同,而且联合类型变量的地址也就是该变量成员的地址。&r,&r.w,&r.b.low的值均相同。联合的概念及联合类型定义第58页/共84页59练习:如果有定义:union xy char ch;int a3;float b;);共用体类型union xy的存储
43、单元中各成员占用空间情况如图:则共用体类型union xy的长度是6(占用内存的字节数)。cha0a1a2b联合的概念及联合类型定义第59页/共84页608.4.2联合变量的定义及成员的引用1.定义联合变量共用体变量的定义有如下三种处理方式:(1)先定义共用体类型,再定义共用体变量。例1:union xy char ch;int a3;float b;/*定义共用体类型union xy*/union xy x,y;/*定义x、y为共用体类型union xy的变量*/第60页/共84页61联合变量的定义及成员的引用(2)在定义共用体类型的同时定义共用体变量。例2:union xy char ch
44、;int a3;float b;x,y;(3)直接定义共用类型变量。例3:union char ch;int a3;float b;x,y;第61页/共84页62联合体与结构体的异同联合体与结构体的异同l联合体与结构体都是由多个成员分量组成的一个整体;l联合体与结构体在定义、说明和使用(成员引用、指针)上十分相似。结构体:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所进行的各种操作互不影响。联联联联合合合合体体体体:多个成员分量共同占占占占用用用用同同同同一一一一存储空间;成员分分分分量量量量之间是相互联系相互联系相互联系相互联系的,所进行的操作相互依赖。第62页
45、/共84页63联合体与结构体的异同联合体与结构体的异同注意注意注意注意:联合在一个时间里不能三个成员同时起作用,而只能有一个成员在起作用,而且是最后被赋值的成员;而结构在任何一个时间都是三个成员同时在起作用。联合变量的长度等于类型最长的成员的长度,而结果变量的长度等于所有成员长度之和。可以在定义结构变量时对每个成员初始化,而不能在定义联合变量时进行初始化。第63页/共84页64联合体与结构体的异同联合体与结构体的异同特别注意:联合类型变量在定义的同时只能对第一个成员的值进行初始化。(因为其它成员的赋初值会改变第一个成员的值)例如:union utype int i;char j;x=65;以上
46、在定义联合类型变量给 x.i 赋初值65,x.j 赋初值A。第64页/共84页652.联合成员的引用 与结构变量一样,对联合变量只能在成员级别上进行操作(称为联合成员的引用),不能直接操作联合变量。联合成员也可以通过定义指向联合的指针来引用。union data int a;float b;char c;data1,*p=&data1;要引用其中的成员b,可用以下三种格式:data1.b p-b (*p).b联合类型某一成员赋值,会覆盖其它成员原来的数据,原来成员的值就乱了,因此,多次赋值,起作用的可能是最后一次存入的成员的值。第65页/共84页66例:假设有一个unsigned long 类
47、型整数,分别将其前2个字节和后2个字节作为两个unsigned int类型输出。main()union unsigned long k;unsigned a2;x;x.k=0 x2e314fdd;printf(%x,%xn,x.a0,x.a1);getch();联合成员的引用第66页/共84页678.5枚举类型实际应用中,某些变量只有几种可能的值,例如在模拟扑克牌的游戏中,扑克牌只有四种花色(梅花、方块、红桃、黑桃),可以把这种变量定义成枚举类型。所谓枚举,是将具有相同属性的一类数据值一一列举。例如:表示星期的Sunday,Monday,Tuesday,Wednesday,Thursday,F
48、riday,Saturday就是一个枚举。枚举是一个具有有限个整型符号常量的集合,这些整型符号常量称为枚举常量。枚举类型就是将变量的可取值一一列举出来,变量只能取其中之一的值.第67页/共84页688.5.1 枚举类型的定义 enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum color1 blue,green,red;enum flag false,true;l lenumenum是关键字是关键字;l l枚枚举举名名和和枚枚举举常常量量是标识符是标识符;l l枚枚举举常常量量之之间间用用逗逗号分隔号分隔。1.枚举类型的定义enum 枚举名 标识符1=整
49、型常数,标识符2=整型常数,;第68页/共84页69枚举类型例如:enum cards club,diamond,heart,spade card1,card2;定义了一个枚举类型enum cards的同时定义了二个该类型的枚举型变量card1与card2,它们的值只能是club,diamond,heart,spade之一。例如:card1=club;card2=spade;是合法的赋值语句。第69页/共84页70说明:(1)enum是C语言的关键字,用于说明枚举类型以及定义枚举变量。再看几个定义:enum weekday Mon,Tue,Wed,Thu,Fri,Sat,Sun;/*说明枚举类
50、型*/enum colors red,green,bluebackcolor,forecolor;/*说明枚举类型的同时定义枚举型变量*/enum weekday workday,week_end;/*用已定义好的枚举类型定义枚举变量*/说明:第70页/共84页71枚举类型(2)枚举类型的说明和变量定义有两种方式(如上),第一种方式把定义和说明分开;第二种方式在说明枚举类型的同时定义枚举变量。(3)枚举类型名和枚举值均为用户定义的标识符(不能是双引号括起来的字符串或数值)。枚举值又称为枚举元素、枚举常量,系统将枚举值作为整型常量来处理。因为是常量,因此不能在程序执行时被赋值,也不能与其它标识符