C语言课件(王曙燕)chp8结构体与共用体.ppt

上传人:牧羊曲112 文档编号:6504324 上传时间:2023-11-07 格式:PPT 页数:32 大小:506KB
返回 下载 相关 举报
C语言课件(王曙燕)chp8结构体与共用体.ppt_第1页
第1页 / 共32页
C语言课件(王曙燕)chp8结构体与共用体.ppt_第2页
第2页 / 共32页
C语言课件(王曙燕)chp8结构体与共用体.ppt_第3页
第3页 / 共32页
C语言课件(王曙燕)chp8结构体与共用体.ppt_第4页
第4页 / 共32页
C语言课件(王曙燕)chp8结构体与共用体.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《C语言课件(王曙燕)chp8结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《C语言课件(王曙燕)chp8结构体与共用体.ppt(32页珍藏版)》请在三一办公上搜索。

1、第八章 结构体和共用体,结构体类型和变量定义结构体数组结构体和函数共用体枚举类型Typedef语句,8.1 结构体类型和变量定义 简单类型是由系统预定义的 如int、float、char等 结构体类型是根据需要由程序员自行定义,因此在使用之前必须先定义结构体类型结构体类型定义格式:struct 结构体类型标识符 结构体成员表;;,struct 结构体名 类型名 成员名;类型名 成员名;.;,先定义结构体类型,再定义结构体变量一般形式:,struct 结构体名 类型名 成员名;类型名 成员名;.;struct 结构体名 变量名表列;,特点:常用方法在该定义后的任意位置仍可用该结构体类型来定义其他

2、 变量适用于需要大量引用该结构体类型的情况可把通用的类型定义集中在一个单独的源文件中,定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型名 成员名;类型名 成员名;.变量名表列;,特点:简略形式,类型定义和变量定义合在一起适用于该结构体类型引用不太多的情况,直接定义结构体变量一般形式:,struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;,特点:适用于一次性定义该结构体类型变量的场合(因为没有定义结构体类型名,所以不能在别处用它来定义其他结构体变量),说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以

3、结构体类型定义可嵌套,结构体变量的初始化 对结构体中的各成员变量赋初值一般格式:结构体类型名 结构体变量=初始化值列表;,例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,说明初始化值列表中初始化数据之间用逗号分隔。初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0。初始化数据的类型要与相应成员变量的类型一致。初始化时只能对整个结构体变量进行,不能仅对结构体类型中

4、的某些成员进行初始化赋值。,结构体变量的引用对结构体变量成员的引用 在C语言程序中,不允许对结构变量整体进行输入输出操作和除赋值外的各种运算,只能是对其成员进行此类操作。引用结构体变量成员的一般形式:结构体变量名.成员名说明:其中“.”是结构体成员运算符,其优先级别最高,结合性是 自左至右。结构体成员扮演的角色和同类型的普通变量完全一样。所以,结构体成员还可进行该成员类型允许的各种运算操作,struct d_type int year;int month;int day;;struct s_type char num7;char name21;char sex;struct d_type bi

5、rthday;float score;char address31;,对结构体变量整体的引用对结构变量整体只能做赋值类的操作可以相互赋值,但注意相互赋值的两个结构体变量必须是 同一个结构体类型,s2=s1;s2.birthday=s1.birthday;,可作为函数的实参到形参的值传递、或函数返回值,详见 下节。,8.3 结构体数组 数组是由相同数据类型的元素组成的,当用相同类 型的结构体作元素就可构成结构体数组。虽然每个元素的内部含不同类型的成员,但从整体上看,每个元素的类型是相同的。结构体数组的定义,先定义后使用,三种形式:,struct student int num;char name

6、20;char sex;int age;struct student stu2;,结构体数组初始化格式:结构体类型名 结构体数组名 数组长度=初始化值列表;注意:一一对应如果初始值的个数小于对应元素的成员个数,则剩余成 员将被初始化为默认值,struct student int num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;,例 struct student int num;char name20;char sex;int

7、 age;stu=,;,例 struct int num;char name20;char sex;int age;stu=,;,结构体数组引用:遵循数组元素、结构体变量的引用法则,一般形式:结构体数组名下标.成员名,struct student int num;char name20;char sex;int age;str3;,说明:可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。例:若数组s的元素类型与变量s0的类型为相同的结构体类型时,要交换两个数组元素,则:s0=si;si=sj;sj=s0;不能把结构体数组元素整体直接进行输入或输出。,例8.2

8、用结构体数组存储学生信息,每个学生有姓名、学号和成绩。从键盘按学号顺序输入N名学生信息,在按成绩从高到低的顺序输出各学生的全部信息。,分析:1、结构体数组(成员变量:姓名、学号、成绩)2、按成绩排序(一维数组排序),#define N 4#include struct int num;charname11;intscore;t,sN;main()int i,j,k;printf(“n请输入第一个学生学号”);scanf%d,printf“n请输入对应学生姓名、成绩”;,for(i=0;iN;i+)printf(“%d”,si.num=k+i);Scanf(“%s%d”,si.name,for(

9、i=0;iN;i+)k=i;for(j=i+1;jN;j+)if(sk.scoresj.score)k=j;if(k!=i)t=si;si=sk;sk=t;printf(“按成绩排序输出:n”);for(i=0;iN;i+)printf(“%d%-10s%5dn”,si.num,si.name,si.score);,8.4 结构体和函数结构体变量作函数参数结构体变量成员作函数参数 结构体变量中的所有成员都可作为函数参数,struct stud_type char name10;long num;char sex;s1;,现将结构体变量s1的成员分别传递给函数 f1,f2,f3:f1(s1.na

10、me);f2(s1.num);f3(s1.sex);若需要将成员地址传递给函数,则加“name是数组,不加“&”。将结构体变量s1整体作实参传递给函数 f():f(s1),结构体变量整体作函数参数老版本的C系统不允许用结构体变量整体作函数参数,只允许用指向结构体变量的指针作函数参数(参见指针章),传递的是结构体变量的首地址。而ANSI C取消了这一限制,规定按值传递方式。在函数调用时,系统为形参结构体变量分配存储空间,并从相应的实参结构体变量中取得各成员的值,若对形参中结构体变量各成员值进行修改,并不能修改实参结构体变量各成员的值。注意,实参和形参结构体变量类型应当完全一致。结构体数组元素也可

11、作为函数的实参进行整体值传递,形参是与数组元素同类型的结构体变量。,例 从键盘输入5名学生信息,用排序函数sore对学生按成绩降序排序,并输出排行榜。,#include struct stud_type char name10;int num;int score;struct stud_type s5;void sort(struct stud_type s);main()int i,j,k;printf(n请输入 5 个学生的n姓名 学号 成绩 n);for(i=0;iN;i+)scanf(%s%d%d,si.name,void sort(struct stud_type stu)int i

12、,k,j;struct stud_type t;for(i=0;iN-1;i+)k=i;for(j=i+1;jN;j+)if(stuk.scorestuj.score)k=j;if(k!=i)t=stui;stui=stuk;stuk=t;,返回值为结构体类型的函数 与其他类型一样,结构体类型也可作为函数的返回值类型。一般形式:结构体类型名 函数名(形参表);说明:用结构体类型定义的函数可以将被调用函数的结构体类型值返回到主调函数。,例8.4 在main函数中定义一个结构体数组,多次调用input函数输入各学生的信息,返回值赋给结构体数组元素,再多次调用print函数输出。,#include“

13、stdio.h”struct st_type char name10;int num;char sex;struct st_type input()struct st_type s0;printf(“请输入姓名:”);gets(s0.name);printf(“请输入学号,性别”);scanf(“%d%c”,main()int i;struct st_type s3;for(i=0;i3;i+)si=input();for(i=0;i3;i+)print(si);,8.5 共用体使几个不同类型的变量共占一段内存(覆盖存储技术),共用体类型定义一般形式:union 类型标识符 共用体成员表;,u

14、nion 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data int i;char ch;float f;s;,说明:Union是共用体类型定义的关键字,共用体成员表由若干成员定义组成。定义共用体类型只是定义了这种类型数据的组织形式,编译时不分配存储空间,所以不能对定义的共用体类型进行赋值或运算,必须先定义后引用。该类型变量的各成员共享内存。共用体成员名可以同程序中的其他变量同名,系统会自动识别它,不会混淆。,共用体变量定义一般形式:union 类型标识符 共用体成员表 变量名表;,注意:共用体变量的存储区=占内存最大的成员所需的存储区共用体变量各成员相互影响,每

15、个时刻只有一个成员的数据有效共用体变量与结构体变量的区别,共用体变量引用 共用体变量整体只可以赋值或作为函数的形参、实参和函数返回值等进行数据传递。共用体变量的成员和普通变量一样,允许进行算术运算、比较运算和输入输出等操作。引用形式:共用体变量名.成员名,union data int i;char ch;float f;union data a,b,c,d3;,引用规则不能引用共用体变量,只能引用其成员,共用体变量的各成员是覆盖存储,某一时刻只能存放其中的一个成员值。,不能在定义共用体变量时初始化,在相同类型的共用体变量之间可以整体赋值和参数传递。,共用体变量不能进行整体输入和输出。,例8.5

16、 通过共用体变量,将一个整数的两个字节分别按十六进制和字符方式输出,union int_char int i;char ch2;print(union int_char x)printf(“i=%dni=%xn”,x.i,x.i);printf(“ch0=%x,ch1=%xn”,x.ch0,x.ch1);printf(“ch0=%c,ch1=%cn”,x.ch0,x.ch1);main()union int_char x;x.i=25419;print(x);,ch0,ch1,结构体中嵌套共用体 例8.6 一个班体育课成绩,男生测验1500米成绩为x分x秒,女生测验柔韧性(分A、B、C、D、E

17、)和俯卧撑次数,将测试数据放在一张表中,表中包括学号、姓名、性别和体育成绩。分析:结构体中嵌套共用体,8.6 枚举类型 某些变量的取值仅限于可一一列举(枚举)出来的几个固定值(如星期、月份)。若用整型数来表示,其可读性差。所以C语言设置了枚举类型。枚举类型也要先定义其类型,再定义该类型的变量。枚举类型的定义一般形式:enum 类型标识符 枚举值名表;,说明:enum是枚举类型定义的关键字,与其后的类型标识符共同组成枚举类型名。每个常量标识符由程序员自定义,不能重名。每个枚举常量都有一个序号,从0起编号。(可改变),enum weekdaysun,mon,tue,wed,thu,fri,sat;

18、,enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;,注意:枚举类型不是构造型数据类型,它只有简单类型。枚举类型定义中,仅定义该简单类型的取值范围,它里面没有成员的概念。,枚举类型的变量定义形式:,enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekday d1,d2;,说明:枚举变量的值只能取该类型定义的几个枚举常量。可将枚举常量或枚举变量赋给一个枚举变量,但不能将一个整数赋给它。,枚举常量的序号(整数)必须强制转换为枚举类型后才能赋值给枚举变量。枚举值可比较大小,规定按序号比较。,枚举值不能直接输入输出,输

19、入通过序号转换,输出则通过switch语句以字符串的方式输出。,#include“stdio.h”main()enum weeksun=7,mon=1,tue,wed,thu,fri,sta;enum week weekday;int i;printf(“input integer:n”);scanf(“%d”,8.7 typedef语句 为系统已定义的简单类型(int、char等)另起一个名称,也可为自己定义的结构体、共用体和枚举等数据类型另起一个名称。定义格式:typedef 类型名 新类型名;说明:仅给已有的类型名重新命名,不产生新的数据类型。#define 与typedef有相似之处,但有本质区别。,举例,typedef struct st_type STUDENT;struct st_type 与 STUDENT等价,优点缩写长的类型定义,使程序简洁、可读性强。将程序参数化,便于移植。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号