资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第5 5章章 结构体与共用体结构体与共用体2本章主要内容本章主要内容u5.1 5.1 结构体类型与结构体变量结构体类型与结构体变量u5.2 5.2 结构体数组结构体数组u5.3 5.3 结构体变量与函数结构体变量与函数* *u5.5 5.5 共用体共用体u5.6 5.6 枚举类型枚举类型u5.75.7 typedef定义类型定义类型u5.4 5.4 结构体变量与指针结构体变量与指针* *35.1 5.1 结构体定义、引用及赋值结构体定义、引用及赋值学号学号学号学号姓名姓名姓名姓名性别性别性别性别年龄年龄年龄年龄成绩成绩成绩成绩地址地址地址地址10010100101001010010 Li JunLi JunLi JunLi JunMMMM1717171785.585.585.585.5FuJianFuJianFuJianFuJianintint num; num;char name20;char name20;char sex;char sex;intint age; age;float score;float score;char address50;char address50;structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; ; ;结构体类型的定义:结构体类型的定义:结构体类型的定义:结构体类型的定义:structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; ; ;结构体类型名结构体类型名结构体各成员结构体各成员定义结构体类型大括定义结构体类型大括定义结构体类型大括定义结构体类型大括号外要加分号号外要加分号号外要加分号号外要加分号 structstructstructstruct student stu1,stu2; student stu1,stu2; student stu1,stu2; student stu1,stu2; 系统不为结构体系统不为结构体 类型的定义开辟类型的定义开辟 内存单元,只当内存单元,只当 定义了结构体变定义了结构体变 量后才会为变量量后才会为变量 分配相应大小的分配相应大小的 内存单元。内存单元。 stu1 stu1 stu1 stu1和和和和stu2stu2stu2stu2在在在在内存占几个字节?内存占几个字节?内存占几个字节?内存占几个字节?A.A.先声明结构体类型再定义结构体变量先声明结构体类型再定义结构体变量structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; ;structstruct student stu1,stu2; student stu1,stu2; (1) (1) 结构体变量的定义结构体变量的定义B.B.声明结构体类型的同时定义结构体变量声明结构体类型的同时定义结构体变量structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50;stu1,stu2;stu1,stu2;C.C.直接定义结构体变量直接定义结构体变量structstruct intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; stu1,stu2; stu1,stu2;这种不带结构体类型这种不带结构体类型名的定义,是无法重名的定义,是无法重用的。用的。说明:说明:a.a.类型与变量名是不同的概念;类型与变量名是不同的概念;b.b.对结构体的成员的使用与普通变量类似;对结构体的成员的使用与普通变量类似;c.c.结构体的成员也可以是另一个结构体;结构体的成员也可以是另一个结构体;structstruct student student intint num; num; char name20; char name20; char sex; char sex; structstruct date birthday; date birthday; float score; float score; char address50; char address50; ;d.d.成员名可以与程序中的其它变量同名。成员名可以与程序中的其它变量同名。 structstruct date date intint year; year; intint month; month; intint day; day; birthday; birthday; (2) (2) 结构体变量的初始化结构体变量的初始化 变量初始化具体形式:变量初始化具体形式: structstruct 结构体类型名结构体类型名 类型说明符类型说明符1 1 成员名成员名1 1; 类型说明符类型说明符2 2 成员名成员名2 2; 类型说明符类型说明符3 3 成员名成员名3 3; 变量名列表变量名列表 初始化数据初始化数据 ; (2) (2) 结构体变量的初始化结构体变量的初始化例例5-1 5-1 对结构体变量初始化。对结构体变量初始化。void main()void main() structstruct student /* student /*定定义结构构体体*/*/ intint num; num; char name25; char name25; char sex; char sex; intint age; age; float score; float score; char addr35;char addr35;student2,student1=102, student2,student1=102, “ “zhangzhang ping, M, 18,85.5, ping, M, 18,85.5, shanghai;shanghai;student2=student1;student2=student1;printf(Numberprintf(Number=%=%d d nNamenName=%s=%s n,student2.num,n,student2.num,student2.names);student2.names);printf(Sexprintf(Sex=%=%c c nScorenScore=%f=%f n,student2.sex,n,student2.sex,student2.scores);student2.scores); (3) (3) 结构体变量的引用结构体变量的引用structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; fl float score;oat score; char address50; char address50;stu1,stu2;stu1,stu2;stu1.num=10021;stu1.num=10021;strcpy(stu1.name, Xiao strcpy(stu1.name, Xiao huahua););stu1.age=18;stu1.age=18;stu1.score=85.5stu1.score=85.5结构体变量的引用:结构体变量的引用:结构体变量名结构体变量名. .成员名成员名结构体变量的成员在引结构体变量的成员在引用时和其同类型的普通用时和其同类型的普通变量引用方法一致。变量引用方法一致。structstruct student student intint num; num; char name20; char name20; char sex; char sex; structstruct date date intint year; year;intint month; month;intint day; day; birthday; birthday; float score; float score; char address50; char address50; stustu; ;stu.birthday.yearstu.birthday.year=2000;=2000;结构体变量的成员结构体变量的成员又是结构体时,应又是结构体时,应一一层层层层找找到到最最低低一一级的成员。级的成员。135.2 5.2 结构体数组结构体数组structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; ;structstruct student stu3 student stu3;structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; ;structstruct student student stustua.a.结构体数组定义结构体数组定义( (方法方法1)1)145.2 5.2 结构体数组结构体数组structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; stustu; ;a.a.结构体数组定义结构体数组定义( (方法方法2)2)structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; stu3; stu3;155.2 5.2 结构体数组结构体数组structstruct intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; stustu; ;a.a.结构体数组定义结构体数组定义( (方法方法3)3)structstruct intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50; stu3; stu3;numnumnamenamesexsexageagescorescoreaddressaddress10011001Lin Lin NinNinF F14147979103 Beijing Road103 Beijing Road10021002Zhang Zhang FanFanMM1515808046 46 TangshanTangshan Road Road10031003Wang Wang YingYingF F1414868610 10 ZhongshanZhongshan Road Road16结结 构构 体体 数数 组组 示示 例例b.b.结构体数组初始化结构体数组初始化structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char address50; char address50;stu3=stu3=1001,1001,Li Li NinNin, M, 14, 79, 103 , M, 14, 79, 103 Beijing Road Beijing Road , ,1002, , Zhang Fan, 1002, , Zhang Fan, M, 15, 80, 46 M, 15, 80, 46 TangshanTangshan Road Road , ,1003, Wang Ying, F, 14, 86, 10 1003, Wang Ying, F, 14, 86, 10 ZhongshanZhongshan Road Road ;1717 例例5.2 5.2 由键盘输入学生信息,并将其输出。由键盘输入学生信息,并将其输出。#include #include void main()void main() structstruct STUD STUD char name20; long num; char name20; long num; intint age; age; char sex; float score; char sex; float score; stud3; stud3; intint i; i; for(ifor(i=0;i3;i+)=0;i3;i+) printf(Inputprintf(Input all information about the all information about the No.%dNo.%d student: student: n,i+1); n,i+1); gets(studi.namegets(studi.name); ); scanf(%ld,%d,%c,%f,&studi.num,&studi.age,&studi.sexscanf(%ld,%d,%c,%f,&studi.num,&studi.age,&studi.sex, , & &studi.scorestudi.score); ); getchargetchar();(); printf( printf( n%-20s%-10s%-4s%-4s%-n%-20s%-10s%-4s%-4s%-6s6s n,Name,Num,Age,Sex,Scores);n,Name,Num,Age,Sex,Scores); for(ifor(i=0;i3;i+)=0;i3;i+) printf(%-20s%-10ld%-4d%-4c%- printf(%-20s%-10ld%-4d%-4c%-6.2f6.2f n,studi.name,studi.num,studi.age,studi.sex,stun,studi.name,studi.num,studi.age,studi.sex,studi.score);di.score); 1818 使几个不同的变量共占同一段内存的结构使几个不同的变量共占同一段内存的结构称为称为共用共用体体类型的结构。类型的结构。 定义共用体类型变量的一般形式为:定义共用体类型变量的一般形式为: union union共用体名共用体名 成员表列成员表列 变量表列;变量表列; 此外,也可以定义共用体数组。此外,也可以定义共用体数组。 5.5 共用体结构体中嵌套共用体:结构体中嵌套共用体: name num sexjobclasspositionLiWang10112086FM ST501prof循环循环n次次读入姓名、号码、性别、职务读入姓名、号码、性别、职务job=s真真真真假假假假读入读入class读入读入position输出输出“输入错输入错”循环循环n次次job=s真真假假输出输出:姓名姓名,号码号码,性别性别,职业职业,班级班级输出输出:姓名姓名,号码号码,性别性别,职业职业,职务职务job=tstruct stuTeacher int num; char name10; char sex; char job; union info int class; char position10; category;person2;同理,共用体中也可以嵌同理,共用体中也可以嵌套结构体。套结构体。例如:例如:例如:例如:union data union dataunion data union dataunion data union dataunion data union data intintintint i i i i; intintintint i; i; i; i; char char char char chchchch; 或或或或 char char char char chchchch; ; ; ; float f float f float f float f; float ffloat ffloat ffloat f;a,b,ca,b,ca,b,ca,b,c; ; ; ; ; ; ; ; union data union data union data union data a,b,ca,b,ca,b,ca,b,c; ; ; ;chif共用体变量的共用体变量的定义和引用定义和引用对于共用体变量的定义:对于共用体变量的定义:union data union data intint i; i; char char chch;float f;float f;a;a;成员的引用:成员的引用:a.ia.ia.cha.cha.fa.f共用体类型的特点共用体类型的特点void main( )void main( ) union data union data intint i; i;char char chch; ;float f;float f;a;a;a.cha.ch=65;=65;a.ia.i=28;=28;printf(iprintf(i=%=%dn,a.idn,a.i); );printf(chprintf(ch=%=%cn,a.chcn,a.ch); );printf(fprintf(f=%4.1fn,a.f);=%4.1fn,a.f); 对对共共用用体体中中的的i i成成员员赋赋值值,之之前前对对成成员员chch赋赋值值不不再再起起作作用用,此此时时仅仅成成员员i i起起作作用用,其其余余成员不起作用成员不起作用。共共用用体体变变量量和和其其各各成成员员的的地地址址均均是是一一样样的的。对对共共用用体体变变量量不不能能初初始始化化,不不能能对对共共用用体体变量名赋值。变量名赋值。5.5. 枚举类型枚举类型一个星期有一个星期有7 7天,分别是:天,分别是:星期星期1,1,星期星期2,2,星期星期3,3,星期星期4,4,星期星期5,5,星期星期6,6,星期天星期天枚举枚举:将变量所有可能值列举出来,变量的值只限于:将变量所有可能值列举出来,变量的值只限于列举出来的值的范围内。列举出来的值的范围内。enumenum weekday weekdaysun, sun, monmon, , tuetue, wed, , wed, thuthu, , frifri, sat;, sat;enumenum weekday workday, weekday workday, week_endweek_end; ;enumenum weekday weekday sun,monsun,mon=5,tue,wed=10,thu,fri,sat;=5,tue,wed=10,thu,fri,sat;24枚枚举类型型定定义,枚枚 举 类 型型 名名 为enumenum weekday weekday枚枚举元元素素, ,枚枚举常常量量枚枚举举元元素素按按常常量量处处理,其理,其值值默默认是按是按其定其定义时的的顺序,序,分分别为0,1,2,3.0,1,2,3.定定 义 中中 , sun=0,sun=0,monmon=1,tue=2.=1,tue=2.枚枚举变量定量定义enumenum weekday weekday sun,mon,tue,wed,thu,fri,satsun,mon,tue,wed,thu,fri,sat ; ;enumenum weekday weekday workday,weekendworkday,weekend; ;workday=workday=monmon; ;workday=1;workday=1;workday=(workday=(enumenum weekday)1; weekday)1;workday=(workday=(enumenum weekday)(7-3); weekday)(7-3); 枚举常量不是字符串常量也不是字符常量,使枚举常量不是字符串常量也不是字符常量,使用时不加单、双引号。用时不加单、双引号。5.5. 用户自用户自定义类型定义类型typedeftypedef intint INTEGER; INTEGER;typedeftypedef long double LD; long double LD;typedeftypedef structstruct intint month; month;intint day; day;intint year; year;DATE;DATE;DATE birthday;DATE birthday;typedeftypedef intint NUM100; NUM100;NUM n;NUM n;26声明一个新类型名方法:声明一个新类型名方法:声明一个新类型名方法:声明一个新类型名方法:1 1 1 1、先先先先按按按按定定定定义义义义变变变变量量量量的的的的方方方方法法法法写写写写出定义体出定义体出定义体出定义体2 2 2 2、将、将、将、将变量名变量名变量名变量名换换换换新类型名新类型名新类型名新类型名3 3 3 3、在最前面加上、在最前面加上、在最前面加上、在最前面加上typedeftypedeftypedeftypedef4 4 4 4、然然然然后后后后可可可可用用用用新新新新类类类类型型型型名名名名去去去去定定定定义变量义变量义变量义变量对对typedef的几点说明:的几点说明:用用typedef可声明各种类型名,但不能用来定义变量可声明各种类型名,但不能用来定义变量。如上例。如上例typedef的使用的使用可以使得数组类型与数组变量分离,利用数组可以使得数组类型与数组变量分离,利用数组类型可以定义多个数组变量,同样可以定义字符串类型类型可以定义多个数组变量,同样可以定义字符串类型等;等;用用typedef只是对已经存在的类型增加一个类型名(只是对已经存在的类型增加一个类型名(“取别名取别名”),而没有创造新的类型;而没有创造新的类型;typedef与与#define有相似之处有相似之处,如,如typedef int COUNT;和和 #define COUNT int。区别:区别:#define是在是在预编译时预编译时处理的,只是作简单的处理的,只是作简单的字符串替换;字符串替换; 而而typedef则则是在是在编译时编译时处理的,并不只是作简单的字符串替换,处理的,并不只是作简单的字符串替换,例如例如typedeftypedef intint NUM10;NUM10;并不是用并不是用NUM10NUM10去代替去代替intint,而是采用如同定,而是采用如同定义变量的方法那样声明一个类型(将原来的变量名换成义变量的方法那样声明一个类型(将原来的变量名换成类型名);类型名); 当不同源文件中用到同一类型数据时,常用当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中然后在需要用到它们的文件中用用#include命令把它命令把它们包含进来们包含进来;使用使用typedef有利于程序的通用与移植有利于程序的通用与移植。例如把一个。例如把一个C C程序从一个以程序从一个以4 4个字节存放整数的计算机移植到以个字节存放整数的计算机移植到以2 2个字节存放整数的系统,不必将程序中的每个个字节存放整数的系统,不必将程序中的每个intint改改成成longlong。只需将定义体语句。只需将定义体语句typedef int INTEGER;改成改成typedef long INTEGER;练练 习习l1 1、利用结构体数组设计候选人得票的统计程序。、利用结构体数组设计候选人得票的统计程序。设有三个侯选人设有三个侯选人LiLi、ZhangZhang与与Fun Fun ,共有,共有1010人参加投票,每次输入一个得票的候选人参加投票,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。人的名字,要求最后输出各人得票结果。l2 2、已知某年的元旦是星期几,打印该年某一月份、已知某年的元旦是星期几,打印该年某一月份的日历表。的日历表。下课啦。下课啦。休息下。休息下。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号