c语言-第8章结构体与共用体.ppt

上传人:wuy****n92 文档编号:70106956 上传时间:2023-01-16 格式:PPT 页数:47 大小:404KB
返回 下载 相关 举报
c语言-第8章结构体与共用体.ppt_第1页
第1页 / 共47页
c语言-第8章结构体与共用体.ppt_第2页
第2页 / 共47页
点击查看更多>>
资源描述

《c语言-第8章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《c语言-第8章结构体与共用体.ppt(47页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第八章第八章 结构体与共同体结构体与共同体8.1 8.1 结构体和共用体概述结构体和共用体概述数组可以存放数组可以存放一组相关的同类型数据一组相关的同类型数据,但是不能,但是不能将不同类型的数据放入同一数组中。将不同类型的数据放入同一数组中。如果需要把一个学生的学号、姓名、性别、年龄、如果需要把一个学生的学号、姓名、性别、年龄、各门功课的考试成绩等各门功课的考试成绩等不同类型的数据不同类型的数据放在一个放在一个构造型数据类型中,就需要另外一种新的数据类构造型数据类型中,就需要另外一种新的数据类型:型:结构体类型或者共用体类型结构体类型或者共用体类型数据。数据。一个一个结构体结构体类型的变量中可

2、以类型的变量中可以独立独立存放多种类型存放多种类型的数据,一个的数据,一个共用体共用体类型的变量中可以类型的变量中可以共用同一共用同一段存储单元段存储单元来存放不同类型的数据。来存放不同类型的数据。结构体类型和结构体变量的定义和使用结构体类型和结构体变量的定义和使用结构体类型需要自定义,结构体类型需要自定义,先定义结构体类型先定义结构体类型后,再定义结构体变量后,再定义结构体变量。结构体类型定义包含:结构体类型中结构体类型定义包含:结构体类型中成员数成员数量量、成员名称成员名称和和成员类型成员类型。结构体变量定义包含:结构体变量定义包含:结构体类型结构体类型、结构体结构体变量名称变量名称。一、

3、结构体类型的定义一、结构体类型的定义格式:格式:struct 结构体名结构体名 类型类型 成员成员1;类型类型 成员成员2;类型类型 成员成员n;;举例:举例:struct studentlong num;char name20;int score4;l成员也可以是一个结构体变量。成员也可以是一个结构体变量。l成员名可以与程序中其它变量同名,二者不代表同成员名可以与程序中其它变量同名,二者不代表同一对象,但为增强可读性,不提倡这样做。一对象,但为增强可读性,不提倡这样做。分号不能少!分号不能少!(2)(2)在定义结构体类型在定义结构体类型的同时定义结构体变量的同时定义结构体变量 structs

4、truct studentstudent long num;long num;char name20;char name20;intint score4;score4;b b;无名无名结构结构体体二、结构体变量的定义二、结构体变量的定义 (1)(1)先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量 structstruct studentstudent long num;long num;char name20;char name20;intint score4;score4;structstruct student student b b;结构体变量占用内存大结构体变量占

5、用内存大小为各成员占用内存大小之小为各成员占用内存大小之和,可用和,可用sizeofsizeof(结构体类结构体类型名型名)或或sizeofsizeof(结构体变量结构体变量名名)求出求出 (3)(3)不定义结构体名不定义结构体名,直直接定义结构体变量接定义结构体变量 structstruct long num;long num;char name20;char name20;intint score4;score4;b b;应区分结构体名与结构体变量名。应区分结构体名与结构体变量名。(4)(4)成员也可以是一个结构体变量成员也可以是一个结构体变量 structstruct datedate

6、intint month;month;intint day;day;intint year;year;structstruct student student intint num;num;char name20;char name20;char sex;char sex;intint age;age;structstruct date birthday;date birthday;char addr30;char addr30;student1,student2;student1,student2;三、结构体变量的初始化三、结构体变量的初始化如:如:struct student long n

7、um;char name20;int score4;b=20030001,张三张三,70,75,80,85,c;bnumname20score4cnumname20score4四、结构体变量的引用四、结构体变量的引用引用结构体成员引用结构体成员的一般形式如下:的一般形式如下:结构体变量名结构体变量名.成员名成员名 例如:例如:struct studentlong num;char name20;int score4;b;各成员的引用:各成员的引用:b.num b.name b.scorei成员运算符成员运算符:.功能功能:访问结构体变量中指定的访问结构体变量中指定的成员成员优先级优先级:最高最

8、高,与括号相同与括号相同不能用不能用student.num等等bnumname20score4不允许将一个结构体变量作为一个整体进行输入不允许将一个结构体变量作为一个整体进行输入输出,而只能对结构体变量中各个成员分别进行输输出,而只能对结构体变量中各个成员分别进行输入输出。入输出。如:如:scanf(”,&b);错误错误!printf(”,b);错误错误!对成员变量可以象普通变量一样进行各种运算。对成员变量可以象普通变量一样进行各种运算。可以引用成员的地址,也可以引用结构体变量的可以引用成员的地址,也可以引用结构体变量的地址。地址。如:如:&b 表示结构体变量表示结构体变量b的首地址的首地址&

9、b.num 表示结构体变量表示结构体变量b 的成员的成员num 的地的地址址结构体变量的引用说明结构体变量的引用说明输出结构体输出结构体变量的值变量的值输入结构体输入结构体变量的值变量的值例例:用结构体变量存放学生记录用结构体变量存放学生记录(学号、姓名、学号、姓名、4 4门成绩门成绩)定义结构体类型和变量定义结构体类型和变量main()struct student long num;char name20;int score4;st;int i;printf(“请输入学生的学号和姓名请输入学生的学号和姓名n);scanf(%ld%s,&st.num,st.name);printf(请输入学生

10、的四门课考试成绩请输入学生的四门课考试成绩n);for(i=0;i4;i+)scanf(%d,&st.scorei);printf(%10ld%-20s,st.num,st.name);for(i=0;i4;i+)printf(%5d,st.scorei);printf(n);8.2 8.2 结构体数组的定义及初始化结构体数组的定义及初始化如:方式如:方式(2)(2)struct student long num;char name20;int score4;a3=20030001,zhang,89,90,91,92,20030002,liu,68,69,70,71,20030003,li,5

11、7,58,59,60;结构体数组初始化结构体数组初始化 结构体数组的定义也有三种方式结构体数组的定义也有三种方式数组各元素在内存中数组各元素在内存中连续存放,如右图所连续存放,如右图所示。示。a0a0a1a1a2a2200300001“zhang”89909192200300002“liu”68697071200300003“li”57585960例例 用结构体数组存放并输出用结构体数组存放并输出5 5个学生记录个学生记录main()struct student long num;char name20;int score4;stu5;int i,j;for(j=0;j5;j+)printf(

12、“请输入学号和姓名请输入学号和姓名:”);scanf(%ld%s,&stuj.num,stuj.name);printf(“请输入成绩请输入成绩:”);for(i=0;i4;i+)scanf(“%d”,&stuj.scorei);for(j=0;j5;j+)printf(%10ld%-20s,stuj.num,stuj.name);for(i=0;i成员名成员名通过指针引用结构体成员通过指针引用结构体成员+p1-num +p1-num 等同于等同于 +(p1-+(p1-numnum)*p1-*p1-numnum 等同于等同于 *(p1-(p1-numnum)指向运算符:指向运算符:-功能功能:

13、对指针所指向的结构体的成员进行访问。对指针所指向的结构体的成员进行访问。优先级优先级:最高,与最高,与“.”的优先级相同。的优先级相同。x.numx.num等同于等同于(*p1).num(*p1).num等同于等同于p1-nump1-numPxnumName20score4注意事项注意事项:如果如果p的初值为的初值为stu,即指向结构体数组的第即指向结构体数组的第1个元个元素素stu0,则则p+1指向下指向下1个元素的起始地址个元素的起始地址stu1。区别:区别:(+p)-num 和和(p+)-nump已定义为指向已定义为指向struct student类型的指针变量类型的指针变量,则则p只能

14、指向只能指向1个结构体类型数据,而不能指向结个结构体类型数据,而不能指向结构体类型的某一成员(即构体类型的某一成员(即p的地址不是成员的地的地址不是成员的地址)。址)。如:如:p=&stu.num;(错误错误)Go5.3.7Go5.3.7例:若有定义:例:若有定义:structstruct stcharstchar name20;name20;intint age;age;char sex;a30,*p=a;char sex;a30,*p=a;则以下错误的语句是(则以下错误的语句是()A)scanf(A)scanf(“%s%s”,p0.name);,p0.name);B)scanf(B)sca

15、nf(“%d%d”,&p0.age);,&p0.age);C)C)scanf(scanf(“%d%d”,&(*,&(*p.agep.age););D)D)scanf(scanf(“%c%c”,&p,&p-sex);-sex);C2.下列对结构体类型变量定义不正确的是()A)struct teacher B)struct int num;int num;int age;teach1;int age;teach1,teach2;C)struct D)struct teacher int num;int num;int age;teacher;int age;struct teacher teach

16、1;struct teacher teach1;C3.若有定义:struct teacher int num;char name10;char sex;int age;float score;teacher1;则变量teacher1所占用的内存字节数是()A)5 B)14 C)19 D)20C联合类型是一种类似于结构体的构造型数联合类型是一种类似于结构体的构造型数据类型,它准许不同类型和不同长度的数据类型,它准许不同类型和不同长度的数据共享同一块存储空间。据共享同一块存储空间。8.4 8.4 联合类型联合类型联合类型定义与结构体类似联合类型定义与结构体类似 union union 联合类型名联

17、合类型名 类型类型 成员名成员名1 1;类型类型 成员名成员名n n;union areaunion area char c_data;char c_data;short s_data;short s_data;long l_data;long l_data;联合类型的定义与结构体定义很类似,只是关键联合类型的定义与结构体定义很类似,只是关键词不同:词不同:structstruct-union-union几个成员占用同一个内存段,因此,联合变量所几个成员占用同一个内存段,因此,联合变量所占的内存长度应为最长的成员长度占的内存长度应为最长的成员长度一、联合类型和联合变量的定义一、联合类型和联合变

18、量的定义联合变量定义与结构体变量定义一样,有三种方式联合变量定义与结构体变量定义一样,有三种方式例如:例如:(2)union uniontype int a;long d;my_data;(3)union int a;long d;my_data;(1)union uniontype int a;long d;union uniontype my_data;一、联合类型和联合变量的定义一、联合类型和联合变量的定义结构体与联合类型可以互相嵌套,例如:结构体与联合类型可以互相嵌套,例如:union uniontype int i;float f;struct structtype short s;

19、long l;struct sutype char c;union uniontype u;union ustype int i;struct structtype st;联合类型和联合变量的定义联合类型和联合变量的定义 联合变量成员的引用类似结构体变量,也是利用联合变量成员的引用类似结构体变量,也是利用运算符运算符“”和和“.”.”。例如:。例如:union uniontype int i;char c;my_data;union uniontype *p;p=&my_data;下列引用都是合法的:下列引用都是合法的:my_data.i,my_data.c,p-i,pc 二、联合变量成员的引

20、用二、联合变量成员的引用课本课本P311P311例例11.1211.12:设有若干个人员的数据,其中有学生:设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、和教师。学生的数据中包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。职务。可以看出,学生和教师所包含的数据是不同的。现在要求把它们放在同一个表格中,如左所示:现在要求把它们放在同一个表格中,如左所示:numnamesexjob101Lifs501102Wangmtprofclass(班班)position(职务职务)structint num;char name10;char

21、sex;char job;union int class;char position10;category;person2;同一内存段可用来存放几种不同类型的成员,但每一同一内存段可用来存放几种不同类型的成员,但每一瞬间只有最后被赋值的成员在起作用。瞬间只有最后被赋值的成员在起作用。联合联合变量和它的各成员都是同一地址。变量和它的各成员都是同一地址。不能对不能对联合联合变量表列赋值,这一点与结构体不一样变量表列赋值,这一点与结构体不一样,如:如:union int i;char ch;float b;a=a,a,1.5;-不对!不对!三、使用联合变量应注意的问题三、使用联合变量应注意的问题 变

22、量a所占内存字节数是()A)4 B)5 C)6 D)8 union U char st4;int i;long l;struct A int c;union U u;a;C1.以下程序的运行结果是()#include union Utype int i;float y;u2;void main()printf(sizeof(u):%dn,sizeof(u);A)2 B)4 C)6 D)8D2.以下C语言共用体类型数据的描述中,不正确的是()A)共用体变量占的内存大小等于所需内存最大的成员所占的内存B)共用体类型可以出现在结构体类型定义中C)在定义共用体变量的同时允许对第一个成员的值进行初始化D

23、)同一共用体中各成员的首地址不相同D枚举的概念枚举的概念 枚举类型也是一种数据类型。对那些只可能枚举类型也是一种数据类型。对那些只可能取有限的某几种值的数据,可以把它定义为枚举取有限的某几种值的数据,可以把它定义为枚举类型数据。类型数据。如果某些变量只有几种可能,如:如果某些变量只有几种可能,如:星期一、星期二、星期一、星期二、星期日星期日 性别及特定范围的概念性别及特定范围的概念可以通过枚举法将变量一一列出,在这种情况下可以通过枚举法将变量一一列出,在这种情况下可以使用枚举类型变量可以使用枚举类型变量8.5 8.5 枚举类型枚举类型 枚举类型定义的一般形式为:枚举类型定义的一般形式为:enu

24、m 枚举名枚举名元素名元素名1,元素名,元素名2,元素名,元素名n;例如:例如:enum month Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec;/*该枚举类型只准许取该枚举类型只准许取12种值种值*/enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;/*该枚举类型只准许取该枚举类型只准许取7种值种值*/一、枚举类型的定义一、枚举类型的定义枚举类型的定义枚举类型的定义请注意:请注意:列在枚举类型定义的列在枚举类型定义的 中的是中的是枚举元素名枚举元素名,它们,它们是常量名,不是串常量(不能加引号),也不是变是常

25、量名,不是串常量(不能加引号),也不是变量名。量名。枚举元素是有值的,称为枚举元素是有值的,称为枚举元素值枚举元素值,默认值分别,默认值分别为为0、1、n-1。例如:例如:enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举元素名分别是枚举元素名分别是Sun、Mon、Tue、Wed、Thu、Fri、Sat,对应值分别为,对应值分别为0、1、2、3、4、5、6。枚举元素的值也可在定义时重指定,而对于没枚举元素的值也可在定义时重指定,而对于没有指定值的元素,其值按顺序加有指定值的元素,其值按顺序加1例如:例如:enum weekday Sun=7,Mon=1,Tu

26、e,Wed,Thu,Fri,Sat;枚举类型的定义枚举类型的定义元素元素名名Sun Mon Tue Wed ThuFriSat元素元素值值7123456枚举元素可以进行比较,比较规则是:序号大者枚举元素可以进行比较,比较规则是:序号大者为大!为大!例如,上例中的例如,上例中的Sun=7、Mon=1、Sat=6,所以所以SatMon、Sun最大。最大。枚举型变量的定义也有三种方式,如:枚举型变量的定义也有三种方式,如:(1)enum weekday Sun,Mon,Tue;enum weekday day;(2)enum weekday Sun,Mon,Tue day;(3)enum Sun,M

27、on,Tue day;二、枚举型变量的定义二、枚举型变量的定义1)可对枚举变量赋值,但只能把枚举元素名赋给)可对枚举变量赋值,但只能把枚举元素名赋给枚举变量,不能把枚举元素值直接赋给枚举变量。枚举变量,不能把枚举元素值直接赋给枚举变量。如如:enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Satworkday;workday=Sat;正确!正确!workday=6;错误!错误!应改为:应改为:workday=(enum weekday)6;2)枚举变量的值不能用)枚举变量的值不能用scanf函数输入,但可用函数输入,但可用printf函数输出函数输出-只能直接输出当前

28、元素的值(数只能直接输出当前元素的值(数值型)。值型)。三、枚举型变量的使用三、枚举型变量的使用 3)可用枚举变量进行判断或比较操作。)可用枚举变量进行判断或比较操作。enum flag true,false my_flag;if(my_flag=true)4)枚举变量可进行自增()枚举变量可进行自增(+)、自减()、自减(-)运算。)运算。利用利用3)、)、4),可用枚举变量控制),可用枚举变量控制for循环。循环。枚举型变量的使用枚举型变量的使用 1.下面程序的输出结果为()#include void main()enum Weekday sun=7,mon=1,tue,wed,thu,f

29、ri,sat;enum Weekday day=sat;printf(“%dn”,day);A)7 B)6 C)5 D)4B2对枚举类型进行定义,不正确的是()A)enum b1,2,3;B)enum aA,B,C;C)enum cD=3,E,F;D)enum dX=0,Y=5,Z=9;A用用typedeftypedef给给已存在已存在的数据类型取别名的数据类型取别名 一般形式为:一般形式为:typedef 类型名类型名 别名;别名;例如:例如:typedef int INTEGER;为为int 重新命名了一个新名字重新命名了一个新名字INTEGER,于是,于是 int a,b;与与 INTE

30、GER a,b;完全等效。完全等效。8.6 8.6 用用typedeftypedef定义类型的别名定义类型的别名注:用注:用typedeftypedef定义的类型名习惯用大写字母表示定义的类型名习惯用大写字母表示typedef int NUM10;/*/*定义定义NUMNUM为有为有1010个元素的个元素的整型数组类型名整型数组类型名*/NUM n;/*/*定义定义n n为整型数组变量为整型数组变量 */typedef char *STRING;/*/*定义定义STRINGSTRING为字符指针类型名为字符指针类型名*/STRING p,s10 ;/*/*定义定义 p p为字符指针变量,为字符

31、指针变量,s s为指针数组为指针数组 */类型别名的定义及使用类型别名的定义及使用typedef struct student char *name;int number;STU;/*/*定义定义STUSTU为结构体类型名为结构体类型名*/STU stu1;/*/*定义定义stu1stu1为结构体变量为结构体变量*/例:能定义例:能定义s s为合法的结构体变量的是(为合法的结构体变量的是()A)A)typedeftypedef structstruct abcabc double a;char b10;s;double a;char b10;s;B)B)structstruct abcabc

32、double a;char b10;double a;char b10;abcabc s;s;C)C)typedeftypedef structstruct double a;char b10;abc;double a;char b10;abc;abcabc s;s;D)D)typedeftypedef abcabc double a;char b10;double a;char b10;abcabc s;s;C1.若有以下说明和定义 typedef int*INTEGER INTEGER p,*q;以下叙述正确的是()A)p是int型变量 B)p是基类型为int的指针变量 C)q是基类型为i

33、nt的指针变量 D)程序中可用INTEGER代替int类型名 B2.若有以下类型说明,叙述正确的是()typedef structint num;char*name;int score;STU,*PSTU;A)STU 是变量名 B)B)PSTU是变量名C)PSTU是指向结构体类型的STU的指针类型名 D)类型说明语句有错误C增强程序的可读性和可移植性增强程序的可读性和可移植性用用typedeftypedef定义数组、指针、结构等类型定义数组、指针、结构等类型将使程序书写简单将使程序书写简单定义类型别名的优点定义类型别名的优点 说明:说明:用用typedeftypedef只是给已有类型增加个别名

34、,并只是给已有类型增加个别名,并不能创造个新的类型。就如同人一样,除学名不能创造个新的类型。就如同人一样,除学名外,可以再取一个小名(或雅号),但并不能创外,可以再取一个小名(或雅号),但并不能创造出另一个人来。造出另一个人来。上机:上机:1 1)课本课本P290P290例例11.411.4 改写本程序:不用指针引用结构体成员,改用改写本程序:不用指针引用结构体成员,改用数组元素直接引用成员。数组元素直接引用成员。2)2)利用结构体类型编制一程序,实现输入三个学生利用结构体类型编制一程序,实现输入三个学生的学号以及数学、语文、英语成绩,然后计算每位的学号以及数学、语文、英语成绩,然后计算每位学

35、生的总成绩以及平均成绩并按总分由大到小输出学生的总成绩以及平均成绩并按总分由大到小输出成绩表。成绩表。作业:作业:1 1)阅读程序,写结果:)阅读程序,写结果:指导指导P 142.30P 142.30、2.342.34(位运算)(位运算)指导指导P 534.21P 534.21 指导指导P 564.35P 564.35 指导指导P1397.18P1397.18 指导指导P24925P249252 2)课本课本P31811.5P31811.5 课本课本P31811.5 P31811.5 有有1010个学生,每个学生的数据包括学个学生,每个学生的数据包括学号、姓名、号、姓名、3 3门课的成绩,从键

36、盘输入门课的成绩,从键盘输入1010个学生数据,个学生数据,要求打印出要求打印出3 3门课总平均成绩,以及最高分的学生的数门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、据(包括学号、姓名、3 3门课成绩、平均分数)。门课成绩、平均分数)。struct studentlong num;char name12;int score3;float ave;main()struct student stu10;int i,j,s,k=0;float average=0;/*/*定义结构体类型定义结构体类型*/输入某个学生输入某个学生记录记录累加某个学生的累加某个学生的3 3门成绩总和门成绩总和

37、求某个学生的平均成绩求某个学生的平均成绩累加总平均成绩累加总平均成绩求出最高分的学生序号求出最高分的学生序号输出最高分学输出最高分学生记录生记录输出总平均成绩输出总平均成绩for(i=0;i10;i+)printf(please input num and namen);scanf(%ld%s,&stui.num,stui.name);printf(please input 3 scoresn);s=0;for(j=0;jstuk.ave)k=i;printf(average=%fn,average/10);printf(%ld%s%f ,stuk.num,stuk.name,stuk.ave);for(i=0;i3;i+)printf(%5d,stuk.scorei);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com