C语言培训教材课件第8章.ppt

上传人:牧羊曲112 文档编号:6503808 上传时间:2023-11-07 格式:PPT 页数:49 大小:426.50KB
返回 下载 相关 举报
C语言培训教材课件第8章.ppt_第1页
第1页 / 共49页
C语言培训教材课件第8章.ppt_第2页
第2页 / 共49页
C语言培训教材课件第8章.ppt_第3页
第3页 / 共49页
C语言培训教材课件第8章.ppt_第4页
第4页 / 共49页
C语言培训教材课件第8章.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C语言培训教材课件第8章.ppt》由会员分享,可在线阅读,更多相关《C语言培训教材课件第8章.ppt(49页珍藏版)》请在三一办公上搜索。

1、1,第8章 结构体与共用体,C 语言程序设计,烟台大学 计算机学院,刘 培 华,2023/11/7,2,第8章 结构体与共用体,8.1 结构体8.2 共用体8.3 枚举类型与类型命名,2023/11/7,3,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?,8.1 结构体,8.1.1 结构体与结构体类型的定义,?,信息管理,结构体一种构造类型数据 结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,2023/11/7,4,struct 结构体名 数据类型1 成员名

2、1;数据类型2 成员名2;数据类型n 成员名n;,8.1 结构体,8.1.1 结构体与结构体类型的定义,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2023/11/7,5,例如图书类型的定义:struct bookcard char num10;/*图书分类编号是字符数组类型*/char name30;/*书名是字符数组类型*/char author30;/*作者是字符数组类型*/char publisher60;/*出版社是字符数组类型*/float price;/*价格是单精度实型

3、*/int n;/*库存量是整型*/;,例如学生类型的定义:struct student char num8;/*学号是字符数组类型*/char name30;/*姓名是字符数组类型*/char sex;/*性别是字符型*/int age;/*年龄是整型*/char addr60;/*住址是字符数组类型*/int score6;/*成绩是整型数组类型*/;,8.1 结构体,8.1.1 结构体与结构体类型的定义,2023/11/7,6,8.1 结构体,8.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,利用已定义的结构体类型名定义变量 struct 结构体名 变量名表;例如:stru

4、ct bookcard book1100;struct student s30,t1,t2;,按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。,2023/11/7,7,8.1 结构体,结构体类型与变量的说明,类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,成员也可以是结构变量。对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员名可与程序中的

5、变量名相同时,也可与不同结构体类型的成员名相同,二者代表不同的对象。,struct date int year,month,day;struct student char num8;char name30;char sex;struct date birthday;/*成员为结构体类型*/char addr60;int score6;,2023/11/7,8,8.1 结构体,8.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,在定义结构体类型的同时定义变量,例如:struct student char num8,name20,sex;int age;float score;st30

6、;,struct 结构体名 成员定义表;变量名表;,2023/11/7,9,8.1 结构体,8.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,直接定义结构体类型变量,例如:struct char num8,name20,sex;int age;float score;st30,a,b,c;,struct 成员定义表;变量名表;,2023/11/7,10,8.1 结构体,8.1.2 结构体变量的定义与初始化,2.结构体变量的初始化,【例8.4】结构体变量的初始化。struct date int year,month,day;struct student char num8,name

7、20,sex;struct date birthday;float score;a=9606011,Li ming,M,1977,12,9,83,b=9608025,Zhang liming,F,1978,5,10,87,c;,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。,2023/11/7,11,8.1 结构体,8.1.2 结构体变量的定义与初始化,2.结构体变量的初始化,【例8.5】结构体数组的初始化。struct s char num8,name20,sex;float score;stu3=9606011,Li ming,M

8、,87.5,9606012,Zhang jiangguo,M,79,9606013,Wang ping,F,90;,元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数,2023/11/7,12,8.1 结构体,8.1.2 结构体变量的定义与初始化,3.结构体变量的运算,用sizeof运算符计算结构体变量所占内存空间,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,sizeof(a)的结果为8+20+1+6+4=39 siz

9、eof(struct student)的结果为39,2023/11/7,13,8.1 结构体,8.1.2 结构体变量的定义与初始化,3.结构体变量的运算,同类型结构体变量之间的赋值运算,结构体变量之间进行赋值时,系统将按成员一一对应赋值。,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a=9606011,Li ming,M,1977,12,9,83,b,c;c=a;,2023/11/7,14,8.1 结构体,8.1.2 结构体变量的定义与初始

10、化,3.结构体变量的运算,对结构体变量进行取址运算,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,对结构体变量a进行&a 运算,可以得到a的首地址,它是结构体类型指针。,2023/11/7,15,8.1 结构体,8.1.2 结构体变量的定义与初始化,4.结构体变量成员的引用,结构体变量成员引用的一般形式:结构体变量名.成员名,结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score,st

11、ruct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,“.”是分量运算符,运算级别最高。,a.birthday.yeara.birthday.montha.birthday.day,结构体变量的各个成员可进行何种运算,由该成员的数据类型决定,2023/11/7,16,8.1 结构体,8.1.2 结构体变量的定义与初始化,【例8.6】编写一个统计选票的程序。struct candidate char name20;/*name为候选人姓名*/int

12、count;/*count为候选人得票数*/list=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;,2023/11/7,17,8.1 结构体,8.1.2 结构体变量的定义与初始化,main()int i,n;printf(Enter voten);scanf(%d,/*输入所投候选人编号*/,2023/11/7,18,9.1 结构体,9.1.2 结构体变量的定义与初始化,for(i=1;i=5;i+)printf(%s:%dn,listi.name,listi.count);printf(%s:%dn,list0.name,list0.count);,2

13、023/11/7,19,8.1 结构体,1.结构体指针变量的定义,结构体指针变量定义的一般形式:struct 结构体名*指针变量名;,struct date int year,month,day;*q;,例如:struct student*p;,p是指向struct student结构体变量的指针变量,8.1.3 结构体的指针,2023/11/7,20,8.1 结构体,8.1.3 结构体的指针,2.结构体成员的三种引用形式,用结构体变量名的引用形式:d.year d.month d.day,struct date int year,month,day;d,*p=,用结构体指针变量的引用形式:(

14、*p).year(*p).month(*p).day p-year p-month p-day,“-”是指向结构体成员运算符,优先级为一级,2023/11/7,21,8.1 结构体,8.1.3 结构体的指针,【例】输入今天的日期,然后输出该日期。main()struct date/*在函数中定义结构体类型*/int year,month,day;today,*p=,2023/11/7,22,结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。,8.2 共用体,8.2.1 共

15、用体与共用体类型的定义,共用体一种构造类型数据 共用体由若干不同类型的数据项组成,构成共用体的各个数据项称为共用体成员。,由于共享的特性,只有最新存储的数据是有效的。,2023/11/7,23,union 共用体名 数据类型1 成员名1;数据类型2 成员名2;数据类型n 成员名n;,8.2 共用体,8.2.1 共用体与共用体类型的定义,共用体类型定义的一般形式:,union为关键字;共用体名是用户定义的类型标识。中是组成该共用体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2023/11/7,24,例如:union utype int i;char ch;long l;char c

16、4;,8.2 共用体,8.2.1 共用体与共用体类型的定义,定义了一个union utype共用体类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成情况。,2023/11/7,25,8.2 共用体,8.2.2 共用体变量的定义与初始化,1.共用体变量的定义,利用已定义的共用体类型名定义变量 union 共用体名 变量名表;例如:union utype u1,u2;,按照共用体类型的组成,系统为定义的共用体变量分配内存单元。共用体变量所占内存大小等于共用体中占用内存的长度最长的成员。,2023/11/7,26,8.2 共用体,8.2.2 共用体变量的定义与初始化,1.共用体变量的定义,

17、在定义共用体类型的同时定义变量,例如:union utype int i;char ch;long l;char c4;a,b,c;,union 共用体名 成员定义表;变量名表;,2023/11/7,27,8.2 共用体,8.2.2 共用体变量的定义与初始化,1.共用体变量的定义,直接定义共用体类型变量,例如:union int i;char ch;long l;char c4;a,b,c;,union 成员定义表;变量名表;,2023/11/7,28,8.2 共用体,8.2.2 共用体变量的定义与初始化,2.共用体变量的运算,用sizeof运算符计算共用体变量所占内存空间,union uty

18、pe int i;char ch;long l;char c4;a,b,c;,sizeof(a)的结果为4 sizeof(union utype)的结果为4,2023/11/7,29,8.2 共用体,8.2.2 共用体变量的定义与初始化,2.共用体变量的运算,同类型共用体变量之间的赋值运算,共用体变量之间进行赋值时,系统仅赋当前有效成员的值(即最新存储的数据)。,union utype int i;char ch;long l;char c4;a,*p=,对共用体变量进行取址运算,2023/11/7,30,8.2 共用体,8.2.2 共用体变量的定义与初始化,3.共用体变量成员的引用,共用体变

19、量成员的引用有三种形式。,例如:union u char u1;int u2;x,*p=,用共用体变量名的引用形式:x.u1 x.u2,用共用体指针变量的引用形式:(*p).u1(*p).u2 p-u1 p-u2,2023/11/7,31,8.2 共用体,8.2.2 共用体变量的定义与初始化,4.共用体变量赋初值,【例8.18】共用体变量赋初值。union u char u1;int u2;main()union u a=0 x9741;printf(1.%c%xn,a.u1,a.u2);a.u1=a;printf(2.%c%xn,a.u1,a.u2);,共用体类型变量在定义时只能对第一个成员

20、进行赋初值。由于第一个成员是字符型,用一个字节,所以对于初值0 x9741仅能接受0 x41,初值的高字节被截去。,1.A 41,2.a 61,2023/11/7,32,8.2 共用体,8.2.2 共用体变量的定义与初始化,main()union long n;int k;char c;un;un.n=0 x12345678;printf(%lxn,un.n);printf(%xn,un.k);printf(%xn,un.c);un.c=A;printf(%ldn,un.n);printf(%dn,un.k);printf(%cn,un.c);,12345678,5678,78,3054198

21、41,22081,A,2023/11/7,33,enum是关键字;枚举名和枚举常量是标识符;枚举常量之间用逗号分隔。,例如:enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum color1 blue,green,red;enum flag false,true;,8.3 枚举类型与类型命名,8.3.1 枚举类型,1.枚举类型的定义,枚举类型定义的一般形式:enum 枚举名 枚举常量取值表;,枚举是一个具有有限个整型符号常量的集合,这些整型符号常量称为枚举常量。每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的

22、取值范围。,2023/11/7,34,在枚举类型中,每个枚举常量都代表一个整型值。在定义枚举类型的同时可隐式或显式地定义枚举常量所代表的值。,例如:enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;,8.3 枚举类型与类型命名,8.3.1 枚举类型,2.枚举常量的整型值,隐式定义:按照类型定义时枚举常量列举的顺序分别代表0、1、2、等整型值。,0,1,2,3,4,5,6,2023/11/7,35,例如:enum op plus=43,minus=45,multiply=42,divide=47;enum workday Mon=1,Tue,Wed,Thu,Fri

23、;,8.3 枚举类型与类型命名,8.3.1 枚举类型,2.枚举常量的整型值,显式定义:在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的值依次递增1。,2,3,4,5,2023/11/7,36,例如:enum flag fg;enum color1 c1;enum color2 blank,brown,yellow,white c2;enum lightblue,lightgreen,lightred c3;,8.3 枚举类型与类型命名,8.3.1 枚举类型,3.枚举变量的定义,枚举类型变量定义的三种形式:enum 枚举名 枚举变量名表;enum 枚举名 枚举

24、常量取值表枚举变量表;enum 枚举常量取值表枚举变量表;,2023/11/7,37,赋值运算 fg=true;c1=red;c2=yellow;c3=lightblue;c3=white;,8.3 枚举类型与类型命名,8.3.1 枚举类型,4.枚举数据的运算,用sizeof运算符计算枚举变量所占内存空间,枚举变量中存放的是整型值,每个枚举变量占用2个字节,是enum color2类型的枚举值,2023/11/7,38,取址运算 enum color2 blank,brown,yellow,white c2;enum flag fg;&c2、&fg,8.3 枚举类型与类型命名,8.3.1 枚举

25、类型,4.枚举数据的运算,关系运算,truefalse SunSat,真(1)假(0),按枚举类型数据所代表的整型值进行比较,2023/11/7,39,在C系统中,不能直接对枚举数据进行输入和输出。由于枚举变量可以作为整型变量处理,所以可以通过间接方法输入输出枚举变量的值。,枚举变量的输出 方法一:直接输出枚举变量中存放的整型值。,8.3 枚举类型与类型命名,8.3.1 枚举类型,5.枚举数据的输入输出,枚举变量的输入,枚举变量作为整型变量进行输入。例如:scanf(%d,1,含义不直观,fg=true;printf(%d,fg);,2023/11/7,40,switch(fg)case fa

26、lse:printf(false);break;case true:printf(true);,8.3 枚举类型与类型命名,8.3.1 枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法二:利用多分支选择语句输出枚举常量对应的字符串。,2023/11/7,41,enum flag false,true fg;char*name=false,true;fg=true;printf(%s,namefg);,8.3 枚举类型与类型命名,8.3.1 枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法三:依据枚举值,运用指针方法输出对应的字符串。,2023/11/7,42,fg=true;pri

27、ntf(%s,fg);,8.3 枚举类型与类型命名,8.3.1 枚举类型,5.枚举数据的输入输出,枚举变量的输出,枚举常量是标识符,不是字符串,以输出字符串方式输出枚举常量是错误的。,2023/11/7,43,8.3 枚举类型与类型命名,8.3.1 枚举类型,【例8.20】编制一个程序。当输入今天的星期序号后,输出明天是星期几。enum weekday Mon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8=error,Mon,Tue,Wed,Thu,Fri,Sat,Sun;,2023/11/7,44,8.3 枚举类型与类型命名,8.3.1 枚举类型,main()en

28、um weekday d;printf(Input todays numeral(1-7):);scanf(%d,2023/11/7,45,8.3 枚举类型与类型命名,8.3.2 类型的重新命名,1.为类型名定义别名,为类型名定义别名的一般形式:typedef 类型名 新类型名或 typedef 类型定义 新类型名,用typedef为已存在的类型名再命名一个新的类型名(即别名)。,typedef是关键字;类型名可以是基本类型、构造类型、指针类型或自定义类型名;新类型名是自定义的类型名。,2023/11/7,46,8.3 枚举类型与类型命名,8.3.2 类型的重新命名,typedef int C

29、OUNTER;/*定义COUNTER为整型类型名*/typedef struct date int year;int month;int day;DATE;/*定义DATE为struct date结构体类型名*/,新类型名与旧类型名作用相同,并且可同时使用。,int i;与 COUNTER i;等价。struct date birthday;与 DATE birthday;等价。,2023/11/7,47,8.3 枚举类型与类型命名,8.3.2 类型的重新命名,2.为类型命名的方法,为基本类型命名例如:typedef float REAL;REAL x,y;/*相当于float x,y;*/,

30、以typedef开头,加上变量定义的形式,并用新类型名替代变量名。,为数组类型命名例如:typedef char CHARR80;CHARR c,d4;/*相当于char c80,d480;*/,2023/11/7,48,8.3 枚举类型与类型命名,8.3.2 类型的重新命名,2.为类型命名的方法,为指针类型命名例如:typedef int*IPOINT;IPOINT ip;/*相当于int*ip;*/IPOINT*pp;/*相当于int*pp;*/,typedef int(*FUNpoint)();FUNpoint funp;/*相当于int(*funp)();*/,2023/11/7,49,8.3 枚举类型与类型命名,8.3.2 类型的重新命名,2.为类型命名的方法,为结构体、共用体类型命名例如:struct node char c;struct node*next;typedef struct node CHNODE;CHNODE*p;/*相当于struct node*p;*/,struct CHNODE*p;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号