
C语言第十一章课件.ppt
24页第十一章第十一章 结构体与共同体结构体与共同体本章要点:u1. 掌握结构和联合类型数据的掌握结构和联合类型数据的定义方法和引用方法;定义方法和引用方法;u2. 了解枚举类型数据的定义方了解枚举类型数据的定义方法和引用方法法和引用方法11.1 概述概述u有时,需将不同类型的数据组合成一个有机的有时,需将不同类型的数据组合成一个有机的整体,以便于引用这些数据是相互联系的整体,以便于引用这些数据是相互联系的如一个学生的有关信息:如一个学生的有关信息:可采用结构体数据结构描述上述信息可采用结构体数据结构描述上述信息例如:例如:struct student{int num; char name[20]; char sex; int age; char addr[30];};;u定义一个结构体类型定义一个结构体类型的一般形式为:的一般形式为:struct 结构体名结构体名 {成员表列成员表列};;对各成员都要进行类型说明;对各成员都要进行类型说明;成员名定名规则与变量名同成员名定名规则与变量名同是类型,不是变量名是类型,不是变量名11.2 定义结构体类型变量的方法定义结构体类型变量的方法方法一:方法一:先定义结构体类型再定义变量名先定义结构体类型再定义变量名struct student{int num; char name[20]; char sex; int age; char addr[30];};;struct student student1, student2;定义定义studet1和和sudent2为为struct student类型变量类型变量不能只指定一个变不能只指定一个变量为量为“struct型型”而不而不指定结构体名指定结构体名•有时,可用符号常量代表一个结构体类型,如:有时,可用符号常量代表一个结构体类型,如:#define STUDENT struct studentSTUDENT{int num; char name[20]; char sex; int age; char addr[30];};这样,可直接用这样,可直接用STUDENT定义变量,如:定义变量,如:STUDENT student1, student2;此时,不必再写关键字此时,不必再写关键字struct方法二:方法二:在定义类型的同时定义变量,在定义类型的同时定义变量,如:如:struct student{int num; char name[20]; char sex; int age; char addr[30];}student1, student2;一般形式是:一般形式是:struct 结构体名结构体名 { 成员表列成员表列 }变量名表列;变量名表列;方法三:方法三:直接定义结构类型变量。
直接定义结构类型变量其一般形式是:其一般形式是:struct { 成员表列成员表列 }变量名表列;变量名表列;此时,不出现结构体名此时,不出现结构体名几点说明:几点说明:1. 类型与变量是不同概念,不要混淆;2. 结构体中的成员,可以单独使用,其作 用与地位相当于普通变量;3. 成员也可以是一个结构体变量;例如:struct date {int month; int day; int year; };Struct student{int num;char name[20];int age;struct date birthday;}student1,student2;4. 成员名可以与程序中的变量名相同,二者不代表同一对象11.3 结构体类型变量的引用结构体类型变量的引用规则:规则:1. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出(引用形式为:结构体变量名结构体变量名.成员名成员名)printf(“………..”,student1);printf(“ %d”, student1.num); 输出输出 10010错!正确!2 .若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。
如:student1.birthday.year (续)(接上片)3. 对成员变量可以象普通变量一样进行各种运算,如: sumage=student1.age+student2.age;4. 可以引用成员的地址,也可以引用结构体变量的地址,如 scanf(“%d”,& student1.num); printf(“%o”,&student1); scanf(“%d,%s,%c,%d,%s”,&student1);错!错!输入输入student1.num的值的值输出输出student1的首地址的首地址11.4 结构体变量的初始化结构体变量的初始化(一)对外部存储类型的结构体变量初始化(一)对外部存储类型的结构体变量初始化: struct student{long int num; char name[20]; char sex; char addr[20];} a={9801,”Wang hong”,’W’,”2 Linggong Road”};main( ){printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name,a.sex,a.addr);}运行结果为:No.:9801name:Wang hongsex:Waddress:2 Linggong Road((二)对静态存储类型的结构体变量初始化,如:二)对静态存储类型的结构体变量初始化,如:main( ){static struct student{long int num; char name[20]; char sex; char addr[20];}a={9801,”Wang hong”,’W’,”2 Linggong Road”};printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n” , a.num,a.name,a.sex,a.addr);} 11.5 结构体数组结构体数组(每个数组元素都是一个结构体类型的数据每个数组元素都是一个结构体类型的数据)(一)结构体数组的定义一)结构体数组的定义,如struct student{int num; char name[20]; char sex; int age; char addr[30];}; struct studnt stu[3];也可直接定义,如也可直接定义,如struct student {int num; … } stu[3];或或struct {int num; … }stu[3];((二)结构体数组的初始化二)结构体数组的初始化(只能对全局的或静态存储类别的数组初始化)struct student{int num; char name[20]; char sex; int age; char addr[30];} stu[3]={{111,”Li”,’M’,18,”Dalian”},{…},{…}};也可采用:也可采用:struct student {int num; … }; struct student stu[]={{…},{…},{…}};结构体数组的初始化的一般形式是在结构体数组的初始化的一般形式是在定义数组后面加上:定义数组后面加上:={初值表列初值表列};;例题:设有三个候选人,每次输入一个得票的候选人的名字,要求例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。
最后输出各人得票结果struct person { char name[20]; int count; }leader[3]={“Li”,0,”zhang”,0,”Liu”,0};main( ){ int i, j; char leader_name[20]; for( i=1;i<=10;i++) { scanf(“%s”,leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)= =0)leader[j].count++); } for(i=0;i<3;i++) printf(“%5s:%d\n”,leader[i].name,leader[i].count); }11.6 指向结构体类型数据的指针指向结构体类型数据的指针结构体变量的指针:结构体变量的指针:是该是该结构体结构体变量所占居的内存段变量所占居的内存段的起始地址例如:的起始地址例如:main( ){struct student{long int num;char name[20];char sex;};struct student stu_1;struct student *p;p=&stu_1;;stu.num=9901;strcpy(stu_1.name,”Li Min”);stu_1.sex=‘W’;printf(“No.:%ld\nname%s\nsex:%c\n”,stu_1.num,stu_1.name,stu_1.sex);printf(“\nNo.:%ld\nname%s\nsex:%c\n”,(*p).num,(*p).name,(*p).sex);}引用结构体成员的三种形式:u结构体变量名结构体变量名.成员名成员名u(*p).成员名成员名up- >成员名成员名指向运算符。
其优先级指向运算符其优先级高于自增、自减运算符高于自增、自减运算符试分析以下运算:p->n 得到p指向的结构体变量中的成员n的值p->n++ 得到p指向的结构体变量中的成员n的值, 用完后使它加1;++p->n 得到p指向的结构体变量中的成员n的值 使其先加1 11.8 共用体共用体11.8.1 共用体的概念共用体的概念共用体:共用体:使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构共用体”类型变量的定义形式定义形式为:union 共用体名共用体名 {成员表列成员表列 }变量表列;变量表列; 例如:union data {int i; char ch; float f;}a,b,c;或或union data{int i;char ch;float f;};union data a,b,c;或或union {int i;char ch;float f;} a,b,c;直接直接定义定义先定义先定义类型类型注意注意共用体类型变量与结构体类型变量的区别区别u结构体类型变量所占内存长度是各成员占的内存长度之和长度之和。
u共用体类型变量所占内存长度等于最长最长的成员的长度的成员的长度11.8.2 共用体变量的引用方式共用体变量的引用方式注意:注意:只能引用共用体变量中的成员,不能引用共用体变量本身如:可以引用 a .i(引用共用体变量中的整型变量i) a .ch(引用共用体变量中的字符变量ch) a .f(引用共用体变量中的实型变量f)不能只引用共用体变量,如: printf(“%d”,a);错啦!错啦!11.8.3 共用体类型数据的特点共用体类型数据的特点1.每一瞬时只有一个成员起作用 ;2. 共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的各成员的地址都是同一地址;4.不能对共用体变量名赋值,也不能企图引用变量名来 得到成员的值,又不能在定义共用体变量时对它初始化5. 不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可使用指向共用体变量的指针;6. 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员 11.9 枚举类型枚举类型u若一个变量只有几种可能的值,可以定义为枚举类型枚举类型。
所谓“枚举枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内u定义方法:定义方法:先定义枚举类型 enum weekday {sun, mon, tue, wed, thu, fri, sat};再用此类型定义变量,如:enum weekday workday, week_end;或或直接定义枚举变量如:enum weekday {sun, mon, tue, wed, thu, fri, sat} workday,week_end;说明:说明:u枚举元素为常量,不是变量,故不能对它们赋值u枚举常量有值如上面定义中,sun 、、 mon 、、 tue ······ sat的值依次为0、、1、、2······7u也可改变枚举元素的值,在定义时指出,如: enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};u枚举值可用来作判断比较,如: if(workday==mon) if(workday>sun)u一个整数不能直接赋值给一个枚举变量,应先进行强制类型转换才能赋值,如: workday=(enum weekday)2; (相当于将序号为2的枚举元素值赋给workday , 即:workday=tue;。
