《C语言综合实验》2构造数据类型.ppt
C语言综合实验构造数据类型构造数据类型主要内容主要内容l结构体结构体 结构体的定义及引用结构体的定义及引用 结构体数组结构体数组 结构体与指针结构体与指针l 共用体共用体l 枚举类型枚举类型l 类型标识符的自定义类型标识符的自定义l结构体与链表结构体与链表1.结构体的定义及引用结构体的定义及引用有时候需要有时候需要将不同类型的数据组合成一个有机的整体将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的。这些组合在一个整体中的数据是互相联系的。如一个学生的信息包括学号如一个学生的信息包括学号、姓名、性别、年龄、成绩、地址等。姓名、性别、年龄、成绩、地址等。numnamesexagescoreaddr08001Li MingM1996.5武汉武汉int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr30;char addr30;应当把它们组织成一个组合项,在应当把它们组织成一个组合项,在一个组合项内包含若干个类型不同一个组合项内包含若干个类型不同(或或相同相同)的数据项。的数据项。语言提供了这种数据结构:语言提供了这种数据结构:允许允许用户将不同类型的数据组合成一个有机用户将不同类型的数据组合成一个有机的整体,这些数据互相联系的整体,这些数据互相联系;这种数据这种数据结构称为结构称为结构体结构体结构体结构体(structure)。结构体的定义是指定义相应的数据结构及相应的变量。结构体的定义是指定义相应的数据结构及相应的变量。步骤:步骤:先定义一个结构体类型标识符先定义一个结构体类型标识符;用该标识符去定义相应的变量用该标识符去定义相应的变量。structstruct studentstudent int num;char name20;char sex;int age;float score;char addr30;;说明:说明:、structstruct是关键字,不能省略是关键字,不能省略是关键字,不能省略是关键字,不能省略:表示:表示定义结构体;定义结构体;、studentstudent是用户自己定义的结构体是用户自己定义的结构体是用户自己定义的结构体是用户自己定义的结构体类型标识符,即该结构体名;类型标识符,即该结构体名;类型标识符,即该结构体名;类型标识符,即该结构体名;、结构体中具体每项的定义,由、结构体中具体每项的定义,由、结构体中具体每项的定义,由、结构体中具体每项的定义,由 和和和和 括起来。语言中把用户自己定括起来。语言中把用户自己定括起来。语言中把用户自己定括起来。语言中把用户自己定义的数据项称为义的数据项称为义的数据项称为义的数据项称为成员成员成员成员(或称为域或称为域或称为域或称为域),即每个成员也叫结构体中的一个域。即每个成员也叫结构体中的一个域。即每个成员也叫结构体中的一个域。即每个成员也叫结构体中的一个域。结构体类型标识符的定义结构体类型标识符的定义定义一个结构体类型的一般形式:定义一个结构体类型的一般形式:structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 类型标识符类型标识符1成员名成员名1;类型标识符类型标识符2成员名成员名2;类型标识符类型标识符n成员名成员名n;结构体名结构体名成成员员表表列列结构体类型标识符的定义结构体类型标识符的定义1、定义形式:定义形式:定义形式:定义形式:struct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符变量名列表变量名列表变量名列表变量名列表;2、定义结构体变量的三种方法:定义结构体变量的三种方法:定义结构体变量的三种方法:定义结构体变量的三种方法:、先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名struct student int num;char name20;float score;;struct studentstruct student stu1,stu2;结构体类型名结构体类型名结构体变量名结构体变量名08001Zhang9208002Li97stu1stu2在定义了结构体变量后,系统会为之分配内存单元。在定义了结构体变量后,系统会为之分配内存单元。sizeof(stu1)=2+20+4=2626结构体变量的定义结构体变量的定义、在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 类型标识符类型标识符1成员名成员名1;类型标识符类型标识符2成员名成员名2;类型标识符类型标识符n成员名成员名n;变量名列表变量名列表变量名列表变量名列表;struct student int num;char name20;float score;stu1,stu2;、直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量structstruct 类型标识符类型标识符1成员名成员名1;类型标识符类型标识符2成员名成员名2;类型标识符类型标识符n成员名成员名n;变量名列表变量名列表变量名列表变量名列表;(不出现结构体类型名不出现结构体类型名不出现结构体类型名不出现结构体类型名)struct int num;char name20;float score;stu1,stu2;3、关于结构体类型的几点说明:关于结构体类型的几点说明:关于结构体类型的几点说明:关于结构体类型的几点说明:、类型与变量是不同的概念,不要混淆:、类型与变量是不同的概念,不要混淆:a、只能对变量赋值、存取或运算,而不能对一个类型赋值、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;存取或运算;b、在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。在编译时,对类型不分配内存空间,只对变量分配空间。、只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元只有在定义变量后,才为该变量开辟存储单元。结构体结构体结构体结构体变量所占的内存长度等于每个成员长度之和变量所占的内存长度等于每个成员长度之和变量所占的内存长度等于每个成员长度之和变量所占的内存长度等于每个成员长度之和;struct student int num;char name20;float score;;sizeof(struct studentstruct student)=26=26、对、对结构体中的成员结构体中的成员结构体中的成员结构体中的成员(“(“域域域域”)”),可以单独使用,可以单独使用,可以单独使用,可以单独使用,它的作用,它的作用与地位相当于普通变量;与地位相当于普通变量;、成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量成员也可以是一个已定义的结构体类型变量:struct date int year;int month;int day;struct student int num;char name20;char sex;struct date birthday;char addr30;sizeof(sizeof(studentstudent)=?注意:结构体变量中各成员按照结构体类型说明的顺序依次存注意:结构体变量中各成员按照结构体类型说明的顺序依次存注意:结构体变量中各成员按照结构体类型说明的顺序依次存注意:结构体变量中各成员按照结构体类型说明的顺序依次存放在一片连续的内存单元中,但它们的长度不同,不能像访问放在一片连续的内存单元中,但它们的长度不同,不能像访问放在一片连续的内存单元中,但它们的长度不同,不能像访问放在一片连续的内存单元中,但它们的长度不同,不能像访问数组元素那样通过下标访问,而是通过它们的名字(即成员名)数组元素那样通过下标访问,而是通过它们的名字(即成员名)数组元素那样通过下标访问,而是通过它们的名字(即成员名)数组元素那样通过下标访问,而是通过它们的名字(即成员名)访问。访问。访问。访问。、成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量成员也可以是指向本结构体类型的指针变量;struct studentstruct student int num;char name20;float score;struct studentstruct student*next*next;、成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同成员名可以与程序中的变量名相同,二者不代表同一对象。,二者不代表同一对象。在定义结构体变量的同时可以给它的全在定义结构体变量的同时可以给它的全部或部分成员赋初值,完成初始化。部或部分成员赋初值,完成初始化。结构体类型名结构体类型名 变量名变量名=初值表列初值表列;struct student stu1=10001,“Li Ming”,“男男”,1983,7,1,”武汉理工大学武汉理工大学”;结构体变量的初始化结构体变量的初始化struct student int num;char name20;char sex;struct date int year;int month;int day;birthday;char addr30;注意:要将结构体变量的各成员的值按注意:要将结构体变量的各成员的值按类型说明时的顺序一一对应;所赋的值类型说明时的顺序一一对应;所赋的值可用常量或常量表达式表示;列出的值可用常量或常量表达式表示;列出的值可以少于成员的个数,没有给出的初值,可以少于成员的个数,没有给出的初值,由系统自动赋予缺省值。由系统自动赋予缺省值。struct student timeint hours,minutes,seconds;nowtime=10,30;1、引用形式:引用形式:引用形式:引用形式:结构体变量名结构体变量名结构体变量名结构体变量名.成员成员成员成员名名名名“.”是成员运算符,在所有的运算符中是成员运算符,在所有的运算符中优先级最高优先级最高。struct student int num;char name20;float score;stu1,stu2;stu1.num=10001;stu1.score=95;stu1.name=Li Ming;strcpystrcpy(stu1.name,Li Ming);结构体变量的引用结构体变量的引用2、不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:不能将一个结构体变量作为一个整体进行输入输出:printf(%d%s%f,stu1);scanf(%d%s%f,&stu1);只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。只能对结构体中的各个成员分别进行输入输出。printf(%d%s%f,stu1.numstu1.num,stu1.namestu1.name,stu1.scorestu1.score);scanf(%d,&stu1.num&stu1.num);gets(stu1.name);gets(stu1.name);结构体变量的引用结构体变量的引用成员名也是一个变量成员名也是一个变量成员名也是一个变量成员名也是一个变量(称为称为称为称为成员变量成员变量成员变量成员变量),具有自己的数据,具有自己的数据,具有自己的数据,具有自己的数据类型,使用与同类型的变量相同。类型,使用与同类型的变量相同。类型,使用与同类型的变量相同。类型,使用与同类型的变量相同。3、只有在对结构体变量只有在对结构体变量只有在对结构体变量只有在对结构体变量赋值赋值赋值赋值或或或或作为函数参数作为函数参数作为函数参数作为函数参数时才可以对一个时才可以对一个时才可以对一个时才可以对一个结构体变量进行整体操作;结构体变量进行整体操作;结构体变量进行整体操作;结构体变量进行整体操作;(赋值时要求具有相同结构赋值时要求具有相同结构赋值时要求具有相同结构赋值时要求具有相同结构)stu2stu2=stu1;stu1;stu2.num=stu1.num;strcpy(stu2.name,stu1.name);stu2.score=stu1.score;void fun(void fun(studentstudent pxpx););fun(fun(stu1stu1););4、如果成员本身又属于一个结构体类型,则要用若干个成员如果成员本身又属于一个结构体类型,则要用若干个成员如果成员本身又属于一个结构体类型,则要用若干个成员如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员。运算符,一级一级的找到最低一级的成员。运算符,一级一级的找到最低一级的成员。运算符,一级一级的找到最低一级的成员。只能对最低一只能对最低一只能对最低一只能对最低一级的成员进行赋值、存取或运算级的成员进行赋值、存取或运算级的成员进行赋值、存取或运算级的成员进行赋值、存取或运算;stu1.birthday.year=2002;结构体变量的引用结构体变量的引用5、对对对对成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算成员变量可以像普通变量一样进行各种运算(根据其类型根据其类型根据其类型根据其类型决定可以进行的运算决定可以进行的运算决定可以进行的运算决定可以进行的运算)sum=stu1.score+stu2.score;stu1.age+;结构体变量的引用结构体变量的引用6、可以引用结构体变量成员的地址,也可以引用结构体变量可以引用结构体变量成员的地址,也可以引用结构体变量可以引用结构体变量成员的地址,也可以引用结构体变量可以引用结构体变量成员的地址,也可以引用结构体变量的地址;的地址;的地址;的地址;scanf(%d,&stu1.num&stu1.num);printf(%x%x,&stu1&stu1);结构体变量的地址主要用于作函数参数,传递结构体变量结构体变量的地址主要用于作函数参数,传递结构体变量结构体变量的地址主要用于作函数参数,传递结构体变量结构体变量的地址主要用于作函数参数,传递结构体变量的地址;的地址;的地址;的地址;7、在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。在定义结构体变量的同时,可以进行初始化。struct student int num;char name20;char sex;char addr30;stu=15001,宋红宋红,M,Beijing;注意:结构体变量的注意:结构体变量的注意:结构体变量的注意:结构体变量的各个初值用大括号各个初值用大括号各个初值用大括号各个初值用大括号、括起来括起来括起来括起来,大括号,大括号,大括号,大括号内各个内各个内各个内各个成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔成员变量的值之间用逗号分隔,其值必须与成,其值必须与成,其值必须与成,其值必须与成员变量一一对应,且员变量一一对应,且员变量一一对应,且员变量一一对应,且数据类型应与成员变量一致数据类型应与成员变量一致数据类型应与成员变量一致数据类型应与成员变量一致。结构体变量的引用结构体变量的引用#include struct student int num;float score;void main()student stu,max;int i;float sum=0;max.score=0;for(i=0;imax.score)max=stu;sum+=stu.score;printf(nMax:%d-%.1fn,max.num,max.score);printf(Sum is:%.1fn,sum);例例例例:输入输入输入输入5 5名学生的学号及成绩,求成绩最好的学生的学号、名学生的学号及成绩,求成绩最好的学生的学号、名学生的学号及成绩,求成绩最好的学生的学号、名学生的学号及成绩,求成绩最好的学生的学号、成绩和所有学生的总成绩。成绩和所有学生的总成绩。成绩和所有学生的总成绩。成绩和所有学生的总成绩。结构体变量的引用结构体变量的引用2.结构体数组结构体数组数组的每个元素都是结构体类型的数据,它们分别包含各个数组的每个元素都是结构体类型的数据,它们分别包含各个成员项。成员项。1、先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组先定义结构体类型,再定义结构体数组struct studentstruct student int num;float score;struct studentstruct student stu30stu30;2、定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组定义结构体类型的同时定义结构体数组struct studentstruct student int num;float score;stu30stu30;3、直接定义结构体数组直接定义结构体数组直接定义结构体数组直接定义结构体数组structstruct int num;float score;stustu3030;一般形式:一般形式:一般形式:一般形式:structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 类型标识符类型标识符1成员名成员名1;类型标识符类型标识符2成员名成员名2;类型标识符类型标识符n成员名成员名n;结构体数组结构体数组结构体数组结构体数组=数组元素数组元素数组元素数组元素0 0的各个初值的各个初值的各个初值的各个初值,数组元素数组元素数组元素数组元素1 1的各个初值的各个初值的各个初值的各个初值,;struct student int num;char name20;float score;stu3stu3=10101,Li Ming10101,Li Ming,8888,1010210102,Zhang JinZhang Jin,92,92,10103 10103,Wang Lin Wang Lin,98.5 98.5;结构体数组的初始化结构体数组的初始化说明:说明:说明:说明:1、初始化时,数组元素的个数可以不指定,系统会根据初值初始化时,数组元素的个数可以不指定,系统会根据初值初始化时,数组元素的个数可以不指定,系统会根据初值初始化时,数组元素的个数可以不指定,系统会根据初值的结构体常量的个数来确定数组元素的个数的结构体常量的个数来确定数组元素的个数的结构体常量的个数来确定数组元素的个数的结构体常量的个数来确定数组元素的个数;struct studentstruct student int num;int num;char name20;char name20;float score;float score;stu=10101,Li Ming,88,stu=10101,Li Ming,88,10102,Zhang Jin,92,10103,Wang Lin,98.5;10102,Zhang Jin,92,10103,Wang Lin,98.5;2、数组中各个元素的初值用大括号数组中各个元素的初值用大括号数组中各个元素的初值用大括号数组中各个元素的初值用大括号 括起来,同一数组元括起来,同一数组元括起来,同一数组元括起来,同一数组元素的各个成员变量的初值用逗号分隔。素的各个成员变量的初值用逗号分隔。素的各个成员变量的初值用逗号分隔。素的各个成员变量的初值用逗号分隔。结构体数组应用举例结构体数组应用举例设李红、王建、赵明三名同学某学年考了设李红、王建、赵明三名同学某学年考了设李红、王建、赵明三名同学某学年考了设李红、王建、赵明三名同学某学年考了8 8门课,要求分别门课,要求分别门课,要求分别门课,要求分别统计出这统计出这统计出这统计出这3 3名同学该学年的总成绩,并按名同学该学年的总成绩,并按名同学该学年的总成绩,并按名同学该学年的总成绩,并按8 8门课总成绩的高低门课总成绩的高低门课总成绩的高低门课总成绩的高低排序输出。排序输出。排序输出。排序输出。#include#include struct studentstruct student char name20;float score;char name20;float score;void main()void main()student stu3=Li Hong,0,Wang Jian,0,Zhao Ming,0;student stu3=Li Hong,0,Wang Jian,0,Zhao Ming,0;student temp;int i,j;float x;student temp;int i,j;float x;for(i=1;i=8;i+)for(i=1;i=8;i+)printf(nInput the%dth course score:n,i);printf(nInput the%dth course score:n,i);for(j=0;j3;j+)for(j=0;j3;j+)printf(Name:%-12sScore:,stuj.name);printf(Name:%-12sScore:,stuj.name);scanf(%f,&x);stuj.score+=x;scanf(%f,&x);stuj.score+=x;for(i=0;i2;i+)for(i=0;i2;i+)for(j=i+1;j3;j+)for(j=i+1;j3;j+)if(stui.scorestuj.score)if(stui.scorestuj.score)temp=stui;stui=stuj;stuj=temp;temp=stui;stui=stuj;stuj=temp;for(i=0;i3;i+)for(i=0;i-numnum、p p-namename、p p-scorescore2、访问结构体成员变量的三种方法:访问结构体成员变量的三种方法:访问结构体成员变量的三种方法:访问结构体成员变量的三种方法:3、说明:说明:说明:说明:、“-”为为指向运算符指向运算符指向运算符指向运算符,是,是优先级最高优先级最高的运算符;的运算符;、成员运算符、成员运算符“.”的优先级高于指针运算符的优先级高于指针运算符“*”,因,因此采用此采用“(*(*p)p).成员名成员名成员名成员名”形式时,形式时,括号不能省略括号不能省略括号不能省略括号不能省略;、注意以下几种运算:、注意以下几种运算:p-nump-num得到得到得到得到p p指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum的值的值的值的值p-num+p-num+得到得到得到得到p p指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum的值,的值,的值,的值,用完后该值加用完后该值加用完后该值加用完后该值加1 1+p-nump-num使使使使p p指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum的值加的值加的值加的值加1 1(2)指向结构体数组的指针指向结构体数组的指针指向结构体变量的指针变量,可以指向结构体变量,也可指向结构体变量的指针变量,可以指向结构体变量,也可指向结构体变量的指针变量,可以指向结构体变量,也可指向结构体变量的指针变量,可以指向结构体变量,也可以指向同类型的结构体数组的元素。以指向同类型的结构体数组的元素。以指向同类型的结构体数组的元素。以指向同类型的结构体数组的元素。struct studentstruct student int num;int num;char name30;char name30;float score;float score;stu30,*p;stu30,*p;p=stu;p=stu;p=&stu3;p=&stu3;p=&stu2.num;p=&stu2.num;p p只能指向一个只能指向一个只能指向一个只能指向一个struct struct studentstudent类型的数据类型的数据类型的数据类型的数据(某个元某个元某个元某个元素的的起始地址素的的起始地址素的的起始地址素的的起始地址),不能指,不能指,不能指,不能指向一个成员变量。向一个成员变量。向一个成员变量。向一个成员变量。(3)结构体指针作为函数参数结构体指针作为函数参数将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有3 3种办法:种办法:种办法:种办法:、用结构体变量的成员作参数:用结构体变量的成员作参数:用结构体变量的成员作参数:用结构体变量的成员作参数:将实参值传递给形参将实参值传递给形参将实参值传递给形参将实参值传递给形参,属于,属于“值传递值传递”方式方式(注意实参与注意实参与注意实参与注意实参与形参的类型保持一致形参的类型保持一致形参的类型保持一致形参的类型保持一致)。fun(fun(stu.numstu.num););void fun(void fun(intint););、用结构体变量作实参:用结构体变量作实参:用结构体变量作实参:用结构体变量作实参:采取的是采取的是采取的是采取的是“值传递值传递值传递值传递”方式,将结构体变量所占的内存单元方式,将结构体变量所占的内存单元方式,将结构体变量所占的内存单元方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。的内容全部顺序传递给形参。的内容全部顺序传递给形参。的内容全部顺序传递给形参。要求形参也必须是同类型的要求形参也必须是同类型的要求形参也必须是同类型的要求形参也必须是同类型的结构体变量结构体变量结构体变量结构体变量。例:有一个结构变量例:有一个结构变量例:有一个结构变量例:有一个结构变量stustu,内含学生学号、姓名、和内含学生学号、姓名、和内含学生学号、姓名、和内含学生学号、姓名、和3 3门课的门课的门课的门课的成绩,在成绩,在成绩,在成绩,在mainmain函数中赋值,在另一函数函数中赋值,在另一函数函数中赋值,在另一函数函数中赋值,在另一函数printprint中打印输出。中打印输出。中打印输出。中打印输出。、用指向结构体变量用指向结构体变量用指向结构体变量用指向结构体变量(或数组或数组或数组或数组)的指针作实参:的指针作实参:的指针作实参:的指针作实参:将结构体变量将结构体变量将结构体变量将结构体变量(或数组或数组或数组或数组)的地址传给形参的地址传给形参的地址传给形参的地址传给形参#include#include#define FORMAT n%dn%sn%.1fn%.1fn%.1fn#define FORMAT n%dn%sn%.1fn%.1fn%.1fnstruct studentstruct student int num;int num;char name20;char name20;float score3;float score3;void print(void print(student psstudent ps)printf(FORMAT,ps.num,ps.name,ps.score0,ps.score1,ps.score2);printf(FORMAT,ps.num,ps.name,ps.score0,ps.score1,ps.score2);void main()void main()student stu=10101,Li Ming,87,96,93;student stu=10101,Li Ming,87,96,93;print(stu);print(stu);主要内容主要内容l结构体结构体 结构体的定义及引用结构体的定义及引用 结构体数组结构体数组 结构体与指针结构体与指针l 共用体共用体l 枚举类型枚举类型l 类型标识符的自定义类型标识符的自定义l结构体与链表结构体与链表共用体共用体:共用体:使几个不同的变量共占同一段内存的结构,使几个不同的变量共占同一段内存的结构,称为称为“共用体共用体”类型的结构。定义形式:类型的结构。定义形式:union 共用体名共用体名 类型标识符类型标识符1成员名成员名1;类型标识符类型标识符2成员名成员名2;类型标识符类型标识符n成员名成员名n;变量表列;变量表列;例如:例如:引用形式:引用形式:共用体名成员名共用体名成员名注意:不能只引用共用体变量注意:不能只引用共用体变量union dataint i;char ch;float f;union data a,b,c;union int i;char ch;float f;a,b,c;直接直接定义定义先定义先定义类型类型注意共用体类型变量与结构体类型变量的区别结构体类型变量所占内存长度结构体类型变量所占内存长度是各成员占的内存是各成员占的内存长度之和长度之和。共用体类型变量所占内存长度共用体类型变量所占内存长度等于等于最长的成员的长度最长的成员的长度。union uarea char c_data;short s_data;long l_data;uareac_datal_datas_datasizeof(union uarea)的结果为?的结果为?共用体类型数据的特点1.每一瞬时只有一个成员起作用每一瞬时只有一个成员起作用;2.共用体变量中起作用的成员是最后一次存放的成员;共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的各成员的地址都是同一地址;共用体变量的地址和它的各成员的地址都是同一地址;4.不能对共用体变量名赋值,也不能企图引用变量名来得到成不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,也不能在定义共用体变量时对它初始化。员的值,也不能在定义共用体变量时对它初始化。5.不能把共用体变量作为函数参数,也不能使函数带回共用体不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;变量,但可使用指向共用体变量的指针;6.共用体类型可以出现在结构体类型定义中,也可以定义共用共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。而结构体也可以出现在共用体类型定义中,数组也体数组。而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。可以作为共用体的成员。枚举类型枚举类型所谓所谓所谓所谓“枚举枚举枚举枚举”是指将变量的所有取值一一列举出来,变是指将变量的所有取值一一列举出来,变是指将变量的所有取值一一列举出来,变是指将变量的所有取值一一列举出来,变量的值只限于列举出来的值的范围内。量的值只限于列举出来的值的范围内。量的值只限于列举出来的值的范围内。量的值只限于列举出来的值的范围内。枚举类型变量的定义:枚举类型变量的定义:枚举类型变量的定义:枚举类型变量的定义:1 1、先定义枚举类型标识符,再定义变量、先定义枚举类型标识符,再定义变量、先定义枚举类型标识符,再定义变量、先定义枚举类型标识符,再定义变量enumenum 枚举类型标识符枚举类型标识符枚举类型标识符枚举类型标识符 枚举元素枚举元素枚举元素枚举元素1 1,枚举元素枚举元素枚举元素枚举元素2 2,枚举元素枚举元素枚举元素枚举元素n n;enumenum 枚举类型标识符枚举类型标识符枚举类型标识符枚举类型标识符 变量列表;变量列表;变量列表;变量列表;enum personenum personMan,Woman;Man,Woman;enum personenum person x;x;enum weekdayenum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum weekdayenum weekday workday,weekend;workday,weekend;2 2、直接定义枚举变量、直接定义枚举变量、直接定义枚举变量、直接定义枚举变量enumenum 枚举类型标识符枚举类型标识符枚举类型标识符枚举类型标识符 枚举元素枚举元素枚举元素枚举元素1 1,枚举元素枚举元素枚举元素枚举元素2 2,枚举元素枚举元素枚举元素枚举元素n n 变量列表变量列表变量列表变量列表;enum personenum personMan,WomanMan,Womanx x;enum weekdayenum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sun,Mon,Tue,Wed,Thu,Fri,Sat Sat workday,weekendworkday,weekend;enumenum BOOLBOOLFALSE,TRUE;FALSE,TRUE;3、说明:说明:说明:说明:SunSun、MonMon、SatSat等称为枚举元素或等称为枚举元素或等称为枚举元素或等称为枚举元素或枚举常量枚举常量枚举常量枚举常量,是,是,是,是用户自定义标识符。用户自定义标识符。用户自定义标识符。用户自定义标识符。枚举变量的引用枚举变量的引用1 1、在编译时,对枚举元素按常量处理,故称、在编译时,对枚举元素按常量处理,故称、在编译时,对枚举元素按常量处理,故称、在编译时,对枚举元素按常量处理,故称枚举常量枚举常量枚举常量枚举常量。但它们不是常量,但它们不是常量,但它们不是常量,但它们不是常量,不能对它们赋值不能对它们赋值不能对它们赋值不能对它们赋值。Sun=0;TRUE=1;2 2、枚举元素作为常量,它们是有值的。、枚举元素作为常量,它们是有值的。、枚举元素作为常量,它们是有值的。、枚举元素作为常量,它们是有值的。语言编译时按定语言编译时按定语言编译时按定语言编译时按定义时的顺序使它们的值为义时的顺序使它们的值为义时的顺序使它们的值为义时的顺序使它们的值为0 0、1 1、2 2、enum weekdayenum weekdaySun,Mon,Tue,Wed,Thu,Fri,SatSun,Mon,Tue,Wed,Thu,Fri,Satworkdayworkday;workday=Mon;printf(%d,workday);3 3、可以在定义时改变枚举元素的值、可以在定义时改变枚举元素的值、可以在定义时改变枚举元素的值、可以在定义时改变枚举元素的值enum weekdayenum weekdaySun=7Sun=7,Mon=1Mon=1,Tue,Wed,Thu,Fri,Satworkday;,Tue,Wed,Thu,Fri,Satworkday;enum weekdayenum weekdaySun=7Sun=7,Mon,Tue,Mon,Tue,Wed=0Wed=0,Thu,Fri,Sat;,Thu,Fri,Sat;4 4、枚举值可以用来做判断比较、枚举值可以用来做判断比较、枚举值可以用来做判断比较、枚举值可以用来做判断比较if(if(workday=Monworkday=Mon)if(if(workdaySunworkdaySun)5 5、一个整数不能直接赋给一个枚举变量、一个整数不能直接赋给一个枚举变量、一个整数不能直接赋给