《c语言教学第十章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《c语言教学第十章结构体与共用体.ppt(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章 结构体与共用体天津工业大学计算机科学与软件学院主讲:孙连坤结构体与共用体学习的意义C数据类型构造类型指针类型空类型void定义类型typedef枚举类型enum数组结构体struct共用体union基本类型字符类型char浮点型单精度型float双精度型double整 型短整型short长整型long整型int只能定义单一的数据类型,反映事物单一属性能定义复杂的数据类型,反映事物多个属性复杂数据类型丰富了C语言对数据信息的处理能力。离开了复杂数据类型,很多信息的描述是无法进行定 义,更无法进行处理的。计算机中的信息表示更多是由复杂数据类型来定义的,象数据结构课程中的链表、树、图等。可以
2、更好地理解数据库中的记录的含义。为C+语言中类的概念的理解提供了帮助。学习目标 结构体与共用体熟练掌握结构体、共用体和枚举数据类型的定义方法;熟练掌握结构体、共用体和枚举变量的定义和引用方法;掌握结构数组的定义及其应用;了解线性链表的创建、插入节点、删除节点和撤销节点的算法;结构体和共用体学习内容 结构体线性链表枚举类型 共用体结构体 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体 -自定义数据类型 引入结构体的好处:加强数据项之间的联系 如学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。nonamesexageclass
3、nograde独立的变量表示:数据项之间无关联nonamesexageclassnograde结构体变量表示:数据项为一个整体char no9;/学号char name20;/姓名char sex;/性别unsigned int age;/年龄unsigned int classno;/班级float grade;/成绩结构体1、结构体类型的定义struct 结构体类型名 数据类型名1 成员名1;数据类型名2 成员名2;数据类型名n 成员名n;struct是关键字,不能省略合法标识符可省:无名结构体成员类型可以是基本型或构造型以分号;结尾 struct Student_Info char no
4、9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩;struct Date int year;/年 int month;/月 int day;/日;结构体在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行定义,就象一次定义多个变量一样。struct Student_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classn
5、o;/班级 float grade;/成绩;struct Student_Info char no9,name20,sex;unsigned int age,classno;float grade;struct Date int year;/年 int month;/月 int day;/日;struct Date int year,month,day;注意:结构类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式,不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。所占内存的大小是它所包含的成员所占内存大小之和。结构体struct Student_In
6、fo char no9,name20,sex;unsigned int age,classno;float grade;struct Student_Info student;2、结构体变量的定义和引用struct 结构体类型名 数据类型名1 成员名1;数据类型名n 成员名n;struct 结构体类型名 变量名列表;结构体变量的定义 间接定义法:先定义结构类型,再定义结构变量 9字节20字节1字节2字节2字节4字节nonamesexageclassnograde内存映像结构体struct student;struct Student_Info student1,student2;一次定义多个结
7、构体类型变量 定义指向结构体类型的指针变量 struct Student_Info *pstu;间接定义法中几种错误的结构体变量的定义方法 没有结构体类型名 Student_Info student;缺省struct关键字 struct Point p;struct Point int x,y;结构类型Point定义在后 结构体2、结构体变量的定义和引用struct 结构体类型名 数据类型名1 成员名1;数据类型名n 成员名n;变量名列表;结构体变量的定义 直接定义法:定义结构体类型的同时定义结构体变量 struct Student_Info char no9;/学号 char name20;
8、/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩 student1,student2;struct char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float grade;/成绩 student1,student2;或无名结构体定义,变量只能一次 结构体几点说明:(1)结构体类型与结构体变量概念不同 类型:不分配内存;变量:分配内存 类型:不能赋值、存取、运算;
9、变量:可以(2)结构体可以嵌套 例:struct date int month;int day;int year;struct student int num;char name20;struct date birthday;stu;numnumnamenamebirthdaymonthmonthdaydayyearyear例:struct student int num;char name20;struct date int month;int day;int year;birthday;stu;numnumnamenamebirthdaymonthmonthdaydayyearyearst
10、ruct Point int x,y;struct Img int tag;struct Img*pimg;/正确,可以包含自身类型的指针 struct Img img;/错误,不能包含自身类型的变量;结构体(3)结构类型中的成员名,可以与程序中的变量同名,它们 代表不同的对象,互不干扰 struct Student_Info student;char name20;(4)结构体类型及变量的作用域和生存期与基本类型变量相同 结构体 结构体变量的引用&引用规则结构体变量不能整体引用,只能引用变量成员引用方式:结构体变量名.成员名 /非指针型结构体变量的引用结构体指针-成员名 或 (*结构体指针)
11、.成员名/指针型结构体变量的引用成员(分量)运算符结合性:从左向右成员(分量)运算符结合性:从左向右结构体例 struct student int num;char name20;char sex;int age;float score;char addr30;stu,*pstu=&stu;strcpy(stu.name,zhangMing);stu.score=80;pstu-score+=10;printf(%s%f,stu.name,(*pstu).score);例 struct student int num;char name20;char sex;int age;float sco
12、re;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例 struct student int num;char name20;char sex;int
13、age;float score;char addr30;stu1,stu2;if(stu1=stu2).()结构体可以将一个结构体变量赋值给另一个结构体变量例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()结构体结构体嵌套时逐级引用结构体变量名.成员名.子成员名最低级子成员名例 struct student int num;char name20;struct date int month;int day;int year;birthday;st
14、u1,stu2,*pstu=&stu1;numnumnamenamebirthdaymonthmonthdaydayyearyearstu1.birthday.month=12;pstu1-birthday.year=2008;注意:在利用指针引用结构体成员时,-和之间不能有空格。struct 结构体类型名 初值表 ;struct 结构体类型名 变量名=成员1的值,成员n的值;结构体3、结构体变量的赋值 结构体变量初始化赋值先定义结构体类型,再定义结构体变量时赋初值注意:赋初值时,中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。struct Student_Info stu=2
15、0020306,ZhangMing,M,18,1,90;nonamesex age classno gradestruct Student_Info stu=18,ZhangMing,M,20020306,1,90;结构体struct Date int year;/年 int month;/月 int day;/日;struct Stu_Info char no9;/学号 char name20;/姓名 char sex;/性别 struct Date birthday;/生日 unsigned int classno;/班级 float grade;/成绩;struct Stu_Info s
16、tu=20020306,ZhangMing,M,1986,12,10,1,90;结构体定义结构体类型的同时,定义结构体变量并赋初值struct 结构体类型名 初值表 变量名=成员1的值,成员2的值,成员n的值;struct Date int year,month,day;birthday=1986,12,10;struct int year,month,day;birthday=1986,12,10;或struct Student_Info char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int c
17、lassno;/班级 float grade;/成绩 student=20020306,ZhangMing,M,18,1,90;结构体strcpy(stu1.no,stu.no);strcpy(stu1.name,stu.name);stu1.sex=stu.sex;stu1.age=stu.age;stu1.classno=stu.classno;stu1.grade=stu.grade;struct Student_Info stu;strcpy(stu.no,20020306);strcpy(stu.name,ZhangMing);stu.sex=M;stu.age=18;stu.cla
18、ssno=1;stu.grade=90;struct Student_Info stu1;stu1=stu;结构体变量在程序中赋值 如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员逐一赋值,或者用已赋值的同类型的结构体变量对它赋值 逐一赋值 利用已赋值的结构体变量赋值 结构体例:计算学生5门课的平均成绩,最高分和最低分。#include struct score float grade5;float avegrade,maxgrade,mingrade;void main()int i;struct score m;printf(input the
19、grade of five course:n);for(i=0;i 5;i+)/输入5门课的成绩 scanf(%f,&m.gradei);m.avegrade=0;m.maxgrade=m.grade0;m.mingrade=m.grade0;for(i=0;i m.maxgrade)?m.gradei:m.maxgrade;m.mingrade=(m.gradei m.mingrade)?m.gradei:m.mingrade;m.avegrade/=5;printf(avegrade=%5.1f maxgrade=%5.1f mingrade=%5.1fn,m.avegrade,m.max
20、grade,m.mingrade);运行结果(设5门课的成绩为:75 80 86 90 68):avegrade=79.8 maxgrade=90.0 mingrade=68.0&m.gradei的运算顺序:&m.gradei&m.gradei注:.和 同优先级,具有左结合性,高于&的优先级结构体4、简化结构体类型名 typedef语句的格式为:typedef 类型名 类型名的别名;必须是已经定义的数据类型名或C语言提供的基本类型名 必须是合法的标识符,通常用大写字母来表示 必须以分号结尾 利用typedef语句为结构体类型起别名,这样可使定义结构体类型的变量显得更为简洁,同时也增加程序的易读
21、性。结构体typedef int INTEGER;/INTEGER是别名typedef char*STRING /STRING是别名struct teacher_info char name20,char sex,unit30;unsigned int age,workyears;float salary;typedef struct teacher_info TEACHER;/TEACHER是别名INTEGER a;/相当于int a;STRING str;/相当于char*str;TEACHER t;/相当于struct teacher_info t;typedef char ARRAY8
22、1;/ARRAY是别名ARRAY str;/相当于char str81;结构体5、结构体数组 结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。结构体数组的定义三种形式:ageagenononamenamesexsexclassnoclassnogradegradeageagenononamenamesexsexclassnoclassnogradegradestu0stu0stu9stu9形式一:struct Student_Info char no9,name20,sex;unsigned int age,classno;float grade;struct Student_In
23、fo stu10;形式二:struct Student_Info char no9,name20,sex;unsigned int age,classno;float grade;stu10;形式三:struct char no9,name20,sex;unsigned int age,classno;float grade;stu10;结构体 结构体数组与二维表的对应关系 结构体数组就相当于一张二维表,一个表的框架对应的就是某种结构体类型,表中的每一列对应该结构体的成员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。nonamesexageclassnog
24、rade结构体类型Student_Infostu0stu0 stu1stu1 stu9stu9 struct Student_Info char no9;char name20;char sex;unsigned int age;unsigned int classno;float grade;stu10;结构体 结构体数组的初始化初始化的格式为:struct 结构体类型名 ;struct 结构体类型名 结构体数组size=初值表1,初值表n;struct 结构体类型名 结构体数组size=初值表1,初值表2,初值表n;或struct Student_Info stu3=20020306,Zh
25、angMing,M,18,1,90,20020307,WangHai,M,17,1,85,20020308,LiHong,F,18,2,95;例:分行初始化结构体struct Student_Info stu =20020306,ZhangMing,M,18,1,90,20020307,WangHai,M,17,1,85,20020308,LiHong,F,18,2,95;例:分行初始化全部初始化时维数可省struct Student_Info stu3=20020306,ZhangMing,M,18,1,90,20020307,WangHai,M,17,1,85,20020308,LiHon
26、g,F,18,2,95;例:顺序初始化结构体 结构体数组的引用引用格式为:结构体数组名下标.成员名;struct Student_Info char no9;char name20;char sex;unsigned int age;unsigned int classno;float grade;stu10;strcpy(stu0.name,WangFei);strcpy(stu0.name,WangFei);stu1.grade+;printf(%s,stu0.name);结构体例:统计侯选人选票。#include#include struct person char name20;/候选
27、人姓名 int count;/得票数 leader3=Li,0,Zhang,0,Wang,0;void main()int i,j;char leader_name20;while(1)/统计候选人得票数 scanf(%s,leader_name);/输入候选人姓名 if(strcmp(leader_name,0)=0)/输入为0结束 break;for(j=0;j 3;j+)/比较是否为合法候选人 if(strcmp(leader_name,leaderj.name)=0)/合法 leaderj.count+;/得票数加1 for(i=0;i 3;i+)/显示后选人得票数 printf(%5
28、s:%dn,leaderi.name,leaderi.count);结构体和共用体学习内容 结构体线性链表枚举类型 共用体线性链表1、线性链表概述及其结构 线性表:当一组数据元素形成了“前后”关系时,我们称之为线性表 线性表在内存中的两种形式l 顺序表:以数组的形式存放,元素在内存中是连续存放的 l 线性链表:数据元素在内存中不需要连续存放,而是通过指针 将各数据单元链接起来,就象一条“链子”一样将数据单元前后 元素链接起来 特点:插入或删除一个数据元素时,需要移动其它数据元素 特点:插入或删除一个数据元素时,不需要移动其它数据元素 headheadtailtail数据数据数据数据1 1数据数
29、据数据数据2 2数据数据数据数据n n 节点指针域表示NULL头节点数据域实际数据链表线性链表线性链表中的节点可以用一个结构体类型来定义,其形式为:struct 节点结构体类型名 数据成员定义;struct 节点结构体类型名 *指针变量名;;例:struct Grade_Info int score;struct Grade_Info *next;typedef struct Grade_Info NODE;线性链表例:简单链表(静态链表)#include#define NULL 0struct studentlong num;float score;struct student*next;v
30、oid main()struct student a,b,c,*head,*p;a.num=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do printf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);运行结果:10101 89.510103 90.01010410107 85.0处理链表问题所需的函数:malloc 函数:void*malloc(unsigne
31、d int size);功能:分配长度为size的内存空间,函数的返 回值是该 段内存空间的起始地址,如果失败,返回空指针。calloc 函数:viod*calloc(unsigned n,unsigned size);功能:分配n个长度为size的内存空间,函数的返 回值是该 段内存空间的起始地址,如果失败,返回空指针。free 函数:free(*p)功能:释放由p指向的内存空间,使这部分内存区能被其它 变量使用,free函数无返回值。线性链表线性链表 链表的创建操作 含义:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。基本思想:首先创建一个头节点,
32、让头指针head和尾指针tail都指向该节点,并设置该节点的指针域为NULL(链尾标志);然后为实际数据创建一个节点,用指针pnew指向它,并将实际数据放在该节点的数据域,其指针域置为NULL;最后将该节点插入到tail所指向节点的后面,同时使tail指向pnew所指向的节点。2、线性链表的基本操作线性链表例:链表创建操作函数Create_LinkList。NODE*Create_LinkList()/创建链表 NODE*head,*tail,*pnew;int score;head=(NODE*)malloc(sizeof(NODE);/创建头节点 if(head=NULL)/创建失败,则返
33、回 printf(no enough memory!n);return(NULL);head-next=NULL;/头节点的指针域置NULL tail=head;/开始时尾指针指向头节点headtail pnew-score=score;pnew-next=NULL;tail-next=pnew;tail=pnew;return(head);例:链表创建操作函数Create_LinkList。headheadtailtailinput the score of students:input the score of students:7070 pnewpnew7070tailtail6565
34、pnewpnew6565tailtail7878 pnewpnew7878tailtail9090 pnewpnewtailtail90909595 pnewpnewtailtail9595-1-1 printf(input the score of students:n);while(1)/创建学生成绩线性链表 scanf(%d,&score);/输入成绩 if(score 0)/成绩为负,循环退出 break;/创建一新节点 pnew=(NODE*)malloc(sizeof(NODE);if(pnew=NULL)/创建新节点失败,则返回 printf(no enough memory!n
35、);return(NULL);线性链表2、线性链表的基本操作 链表的插入操作 含义:在第i个结点Ni与第i+1节点Ni+1之间插入一个新的结点N,使线性表的长度增1,且Ni与Ni+1的逻辑关系发生如下变化:插入前,Ni是Ni+1的前驱,Ni+1是Ni的后继;插入后,新插入的结点N成为Ni的后继、Ni+1的前驱 基本思想:通过单链表的头指针head,首先找到链表的第一个结点;然后顺着结点的指针域找到第i个结点,最后将pnew指向的新结点插入到第i个结点之后。插入时首先将新节点的指针域指向第i个结点的后继节点,然后再将第i个结点的指针域指向新节点。注意顺序不可颠倒。当i=0时,表示头节点。例:链表
36、插入操作函数Insert_LinkList。void Insert_LinkList(NODE*head,NODE*pnew,int i)NODE*p;int j;p=head;for(j=0;j next;if(p=NULL)/表明链表中第i个节点不存在 printf(the%d node not foundt!n,i);return;pnew-next=p-next;/将插入节点的指针域指向第i个节点的后继节点 p-next=pnew;/将第i个节点的指针域指向插入节点 headhead70706565787890900 01 12 23 34 46565pnewpnew假设i=2p pp
37、 pp p线性链表2、线性链表的基本操作 链表的删除操作 含义:删除链表中的第i个结点Ni,使线性表的长度减1。删除前,节点Ni-1是Ni的前驱,Ni+1是Ni的后继;删除后,结点Ni+1成为Ni-1的后继。基本思想:通过单链表的头指针head,首先找到链表中指向第i个结点的前驱节点的指针p和指向第i个节点的指针q;然后删除第i个结点。删除时只需执行p-next=q-next即可,当然不要忘了释放节点i的内存单元。注意当i=0时,表示头节点,是不可删除的。例:链表删除操作函数Delete_LinkList。void Delete_LinkList(NODE*head,int i)NODE*p,
38、*q;int j;if(i=0)return;/删除的是头指针,则返回 p=head;/将p指向要删除的第i个节点的前驱节点 for(j=1;j next!=NULL;j+)p=p-next;if(p-next=NULL)/表明链表中第i个节点不存在 printf(the%d node not foundt!n,i);return;headhead70706565787890900 01 12 23 34 4假设i=2p p q=p-next;/q指向待删除的节点i p-next=q-next;/删除节点i free(q);/释放节点i的内存单元 p pq q线性链表2、线性链表的基本操作 链
39、表的输出操作 含义:将链表中节点的数据域的值显示出来。如果在输出过程中,对数据进行相应的比较,则可实现对链表的检索操作。基本思想:通过单链表的头指针head,使指针p指向实际数据链表的第一个节点,输出其数据值,接着p又指向下一个节点,输出其数据值,如此进行下去,直到尾节点的数据项输出完为止,即p为NULL为止。void Display_LinkList(NODE*head)NODE*p;for(p=head-next;p!=NULL;p=p-next)printf(%d,p-score);printf(n);例:链表输出操作函数Display_LinkList。线性链表2、线性链表的基本操作
40、链表的销毁操作 含义:将创建的链表从内存中释放掉,达到销毁的目的 基本思想:每次删除头节点的后继节点,最后删除头节点。注意,不要以为只要删除了头节点就可以删除整个链表,要知道链表是一个节点一个节点建立起来的,所以销毁它也必须一个一个节点的删除才行。void Free_LinkList(NODE*head)NODE*p,*q;p=head;while(p-next!=NULL)q=p-next;p-next=q-next;free(q);free(head);例:链表销毁操作函数Free_LinkList。headhead70706565787890900 01 12 23 34 4p pq q
41、q qq qq q结构体和共用体学习内容 结构体线性链表枚举类型 共用体共用体l 构造数据类型,也叫联合体l 用途:使几个不同类型的变量共占一段内存(相互覆盖)1、共用体类型的定义 union 共用体类型名 数据类型名1 成员名1;数据类型名2 成员名2;数据类型名n 成员名n;类型定义不分配内存chchi if f20002000200120012002200220032003共占4字节sizeof(union UData)=sizeof(f)共用体的大小是成员中占内存最大的成员的大小 union UData short i;char ch;float f;chchi if f2000200
42、020012001200220022003200320042004200520052006200620072007共占7字节struct SData short i;char ch;float f;共用体共用体2、共用体变量的定义和引用 联合体变量的定义形式一:union data short i;char ch;float f;a,b;形式二:union data short i;char ch;float f;union data a,b,*p,d3;形式三:union short i;char ch;float f;a,b,c;f fchchi if fchchi ia ab b共用体变
43、量任何时刻只有一个成员存在共用体变量定义分配内存,长度=最长成员所占字节数共用体 联合体变量的引用联合体变量名.成员名联合体指针名-成员名 或 (*联合体指针名).成员名 union data int i;char ch;float f;union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.f共用体3、联合体变量的赋值 联合体变量的初始化赋值 定义联合体变量时可以对变量赋初值,但只能对变量的第一个成员赋初值,不可象结构体变量那样对所有的成员赋初值。union UData short i
44、;char ch;float f;union UData data=10;/10赋给成员iunion UData data=A;/A赋给成员i,即i的值为65(A的ASCII码)union UData data=10,A,12.5;/错误,中只能有一个值union UData data=10;/错误,初值必须用 括起来共用体3、联合体变量的赋值 联合体变量在程序中赋值 定义了联合体变量以后,如果要对其赋值,则只能通过对其成员赋值,不可对其整体赋值。具有相同联合体类型的变量之间也可以相互赋值。union UData short i;char ch;float f;union UData data
45、,*p,d10;data=10;/错误data=10;/错误data.i=10;/正确,将10赋给data的成员ip=&data;/p指向datap-f=12.5;/正确,将12.5赋给data的成员fd0.ch=A /正确,将A 赋给d0的成员chunion UData data1=10,data2;data2=data1;/正确共用体几点说明:由于联合体变量的各成员共享同一地址的内存单元,所以在对其成员 赋值的某一时刻,存放的和起作用的将是最后一次存入的成员值 对联合体变量的某个成员赋值时,也改变了其它成员的值,因为它们 共享一个内存地址。由于联合体变量所有成员共享同一内存空间,因此联合体
46、变量与其各成员的地 址相同。union UData data;data.i=10;data.ch=A;data.f=12.5;则data.f的值才是有效的成员的值。union UData data;data.i=10;data.ch=A;则data的成员i的值将变为65(A的ASCII码值)。union UData data;则&data与&data.i、&data.ch、&data.f均相同共用体例:共用体成员间的相互影响。#include void main()union long L;short a;char ch;d=0 xFFF11241;printf(d.ch=%c d.a=%X
47、d.L=%Xn,d.ch,d.a,d.L);d.a+;printf(d.ch=%c d.a=%X d.L=%Xn,d.ch,d.a,d.L);chcha aL L200020002001200120022002200320030XFF0XFF0XF10XF10X120X120X410X41运行结果:d.ch=A d.a=1241 d.L=FFF11241d.ch=B d.a=1242 d.L=FFF112420X420X42结构体和共用体学习内容 结构体线性链表枚举类型 共用体枚举类型 如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓“枚举”,顾名思义,就是把这种类型数据可取的值一一
48、列举出来。一个枚举型变量取值仅限于列出值的范围。枚举数据类型通常的定义形式为:enum 枚举类型名 枚举元素表;由多个标识符组成,标识符之间用逗号分开 定义枚举类型:enum weekday sun,mon,tue,wed,thu,fri,sat;定义枚举类型变量:enum weekday today,nextday;enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;取值enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;today=sun;nextday=mon;if(tod
49、ay=sat)nextday=sun;today=100;C编译对枚举元素实际上按整型常量处理,当遇到枚举元素列表时,编译程序就把其中第一个标识符赋0值,第二、三、个标识符依此赋1,2,。enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;0 01 12 23 34 45 56 6today=sun;printf(today=%d,today);运行结果:today=0 枚举类型可以在枚举类型定义时指定枚举元素的值 enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;7 71 12 23 34 45
50、 56 6注意:枚举元素是常量,在程序中不可对它赋值。例如:sun=0;mon=1;将产生错误。枚举类型if(today=6)nextday=0;if(today=sat)nextday=sun;定义枚举类型的好处:用标识符表示数值增加了程序的可读性 清晰不清晰 可限制了变量的取值范围 如today只能取sunsat中的值 枚举类型本章小结 结构体、联合体及枚举类型都是用户自定义的数据类型,它们均属于构造数据类型,是用户定义新数据类型的重要手段。结构和联合有很多的相似之处,它们都由成员组成。成员可以具有不同的数据类型。成员的表示方法相同。都可用间接和直接两种方式作变量说明。在结构体中,各成员都