C语言程序设计教学课件6- 结构体、共用体、枚举类型及应用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引用共用体变量成员的一般形式:共用体变量名.成员名
例如,定义了d1为共用体变量,则d1.c、d1.i、d1.j分别表示引用共用体变量d1 的3个成员。
6.5 共用体类型
6.5.2 共用体类型的变量
3、结构体与共用体的比较
“共用体”和“结构体”的声明、定义变量的形式、变量的引用方法相 似,但有区别:
若把一个结构体数据的起始地址赋给一个指针变量,则该指针变量就指向这个结构 体数定据义。结构体指针变量的一般形式为:
struct 结构体名 *结构体指针变量名;
例如: struct Student *pstu; 指针变量pstu就可以用来指向struct Student类型的变量或数组元素。
6.4 结构体指针
定义的两个变量stu1和stu2都是struct Student结构体类型的,都具有struct Student类 型的结构:
6.2 结构体变量
6.2.1 定义结构体变量的方法
2、在声明结构体类型的同时定义结构体变量
这种方式,声明类型和定义变量一起 进行,能直接看到结构体的结构,较为直 观,在编写小程序时常用此方法。
也可以在声明枚举类型的同时,定义枚举变量:
enum Weekday{Sun, Mon, Tue, Wed, Thu, Fri, Sat} workday, restday;
或
enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat} workday, restday;
枚举变量只能取枚举声明中的某个枚举元素值:workday = Mon; restday = Sat;
6.5 共用体类型
6.5.3 共用体的应用举例
【例6.10】设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业、教研室4 项,学生有姓名、年龄、职业、班级4项。
思考与练习:根据声明的结构体,编程:输入人员数据, 再以表格输出。
6.6 枚举类型
在实际应用中, 如果一个变量只有几种可能的取值,例如一星期只有7天,那么该变量可 定义为“枚举(enumeration)类型”。
6.4 结构体指针
6.4.4 结构体指针数组及其应用
结构体指针数组可以存放多个结构体数据的指针(地址)。
思考与练习:
【例6.7】用结构体指针数组输出例6.5的结构体数组。 【例6.8】用结构体指针数组名作为函数参数,实现:输入若干名学生的 信息(学号、姓名、多门课成绩),然后分别按学号和按总分从高到低输出 所有学生的信息。
结构体变量(所有成员共存)所占的内存长度是各成员所占内存长度之和。 共用体变量(各个成员互斥),在任何时刻只能使用其中的一个成员。所占的 内存长度等于最长成员的长度,例如,共用体变量d1占4个字节(成员j的长度)。
共用体变量的地址和它的各成员的地址是同一地址。 例如:&d1和&d1.i、&d1.c、&d1.j相同。
C语言程序设计
教学内容:
第1章:C语言语法基础 第2章:C程序设计基础 第3章:利用数组处理同类型的批量数据 第4章:利用函数实现模块化程序设计 第5章:灵活使用指针 第6章:结构体、共用体、枚举类型及其应用 第7章:常用的三种线性数据结构 第8章:利用文件进行数据管理 第9章:嵌入式技术基础实践方法
则:枚举元素Sun=7,Mon=1,其后的元素按照顺序依次加1,如Fri=5。
2、只能把枚举元素赋予枚举变量,但不能把元素的数值直接赋予枚举变量。
例如:workday=Mon;
//正确
workday=1;
//错误
workday=(enum Weekday) 1; //正确(强制类型转换),相当于workday=Mon;
3、枚举元素是常量,不是变量,因此不能在程序中再对它赋值。
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(1)先声明共用体类型,再定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(2)在声明共用体类型的同时定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
第6章 结构体、共用体、枚举类型及其应用
【学习内容】
【学习目标】
6.1 结构体类型概述
1.掌握结构体类型的声明方法;
6.2 结构体变量
2.掌握结构体变量的定义、初始化及成员
6.3 结构体数组
引用方法;
6.4 结构体指针
3.掌握结构体数组及应用;
6.5 共用体类型
4.掌握结构体指针及应用;
6.6 枚举类型
6.3 结构体数组
6.3.2 结构体数组的初始化
对结构体数组,可以进行初始化赋值。 例如:
6.3 结构体数组
6.3.2 结构体数组的应用
【例6.2】计算学生的平均成绩,并统计不及格的人数。
6.3.2 结构体数组的应用
【例6.3】建立同学通讯录。
6.3 结构体数组
6.4 结构体指针
6.4.1结指构体向指结针构是体用变来指量向的结指构针体数据(结构体变量或结构体数组元素)的指针,
结构体变量成员的引用形式: 结构体变量名.成员名
例如: stu1.stu_ID stu2.sex
即第一名学生的学号 即第二名学生的性别
成员(分量)运算符 “.”的优先级最高。stu1.stu_ID作为一个整体看待。
若成员本身又是一个结构体类型,则必须逐级找到最低级的成员才能使用。 例如:stu1.birthday.month 为第1名学生出生的月份
“枚举”是指将变量的值一一列举出来,变量的值仅限于列举值的范围内。 声明枚举类型:enum Weekday {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
花括号中的Sun、 Mon、 …、 Sat称为枚举元素或枚举常量。 注意:枚举常量之间是用逗号间隔,而不是分号。 定义枚举变量:
6.4.1 指向结构体变量的指针
【例6.4】通过3种方式访问结构体变量中的成员。
若结构体指针变量指向了一结构体数据(结 构体变量或结构体数组元素),则访问结构体 数据的成员有3种形式:
(1)结构体变量名.成员名 或 结构体数组元 素名.成员名
(2)(*结构体指针变量名).成员名 (3)结构体指针变量名->成员名
d1 ={ 'a', 12, 345};
//错误,不能对变量整体赋值
d1.i = 12;
//将12赋给d1的成员i
d2=d1;
//同类型的共用体变量相互赋值
d[0].c = 'a';
//将'a' 赋给d[0]的成员c
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(3)共用体的所有成员都是从低地址开始存放的。 对其中的某个成员赋值,会覆盖其他成员相应字节上的值。 例如: d1.i = 0x12; d1.j = 0x345; d1.c = 'a'; 思考:变量d1存储单元中的值是多少?
6.4 结构体指针
6.4.2 指向结构体数组的指针
当结构体指针变量指向结构体数组中的某个元素时,结构体指针变量的值是 该结构体数组元素的起始地址。
【例6.5】用结构体指针变量输出结构体数组。
6.4 结构体指针
6.4.3 结构体指针变量作函数参数
【将例一6.6个】结计算构一体组数学据生传的递平给均另成一绩个和函不及数格时人,数若。采要用求“用地结址构传体指递针”变的量方作式函(数用参指数向编程。 结构体数据的指针变量作函数参数,将结构体数据的起始地址传递给形参),则会 减少时间和空间上的开销,大大提高程序执行效率。
6.5 共用体类型
6.5.3 共用体的应用举例
【例6.9】利用共用体类型测试CPU的大端、小端模式。
大端模式:数据的低字节(尾巴)保存在内存的高地址中,高字节保存在低地址中; 小端模式:数据的低字节(尾巴)提保示存:在地数内址组存,是的c从[低1低]地存地址放址中在开,高始高地存字址放节。,保即存c[在0]高存地放址在中低。 数据0x12345678(低字节为0x78)在内存中的大端、小端存储模式:
6.6 枚举类型
说明:
//声明枚举类型 //定义枚举类型变量
1、枚举元素表中的每一个枚举元素都代表一个整数,默认值依次为0、1、2、 3、…。如在上面的定义中,Sun=0,Mon=1,…,Sat=6。
若人为地指定枚举元素的数值:
enum Weekday{Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
union UData d1 = 'a';
//错误,初值必须用{ }括起来
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(2)共用体变量在程序中赋值
定义了共用体变量以后,只能对其成员赋值,不可对其整体赋值。同类型的共用 体变量可以相互赋值。
例如: union UData d1, d2,d[10]; //定义共用体类型的变量、数组
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(1)共用体变量的初始化赋值
定义共用体变量时,可以对变量赋初值,但只能对变量的一个成员赋初值,而不 能对所有的成员赋初值。
例如: union UData d1 = { 'a'};
// 'a'赋给变量d1的第1个成员c
union UData d1 = { 'a', 12, 345}; //错误,{ }中只能有一个值
6.5 共用体类型
6.5.1 共用体类型的概念
将变量c、i、j放在同一地址2000开始的内存单元中。这种使多个不同的变量 共用一段内存的结构,称为“共用体”或“联合体”——实现多个变量分时复用 内存。
声明一个共同体类型的一般形式为: union 共用体名 { 成员列表 };
6.5 共用体类型
6.5.2 共用体类型的变量
5.掌握共用体、枚举类型及应用;
6.7 用typedef声明新类型名 6.掌握typedef声明新类型名的方法;
6.1 结构体类型概述
前面学习的数组是将相同类型的多个数据组合在一起。 如果一名学生的信息:学号为整型,姓名为字符型,性别为字符型,成绩为实型,能 否用数组存放该学生的信息呢?
为解决这一问题,C语言允许用户自己建立由不同类型(或同类型)数据组成 的组合型数据结构——“结构体”。
6.2 结构体变量
6.2.声1 明定的义结构结体构类体型,变仅量相的当方于一法个模型,其中并无具体数据,系统并不对其分配内存空
间定。义1、系结统构先只体声对类明变型结量的构或变数量体组或类分数型配组,内。再存空定间义,结因构此体为了变能量在程序中使用结构体类型的数据,应当
这种方式,声明类型和定义变量分离,在 声明类型后可以随时定义变量,使用灵活。
6.2 结构体变量
6.2.2 结构体变量的初始化
和其他类型的变量一样,结构体变量可以在定义时进行初始化赋值。初始化 列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的成员。
6.2 结构体变量
6.2.3 结构体变量的引用
在定义结构体变量以后,便可引用该变量。C允许具有相同类型的结构体变量相互赋值; 而对结构体变量的输入、输出及各种运算都是通过结构体变量的成员来实现的。
6.2 结构体变量
6.2.3 结构体变量的引用
【例6.1】结构体变量的初始化和引用。
6.3 结构体数组
6.3.1一定个义结构结体构变体量数可组以存的放方一法名学生的信息,而结构体数组可以存放多名学生的
信息,结构体数组中的每个元素都是一个结构体类型的数据。
定义的结构体数组stu,共有5个元素,stu[0]~stu[4]。每个数组元素都是struct Student结构体类型的。
6.2 结构体变量
6.2.1 定义结构体变量的方法
3、不指定结构体名而直接定义结构体变量
这种方式,由于没有结构体名,因此 不能再用此结构体类型去定义其他变量, 实际应用较少。
6.2 结构体变量
6.2.1 定义结构体变量的方法来自说明:(12)结构体中的成员名也可与以程是序一中个其结它构变体量类同型名的,变但量二。者例代如表:不同的对象,互不干扰。
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(3)不指定共用体名而直接定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
2、共用体变量的引用方法
在定义共用体变量以后,便可引用该变量。C允许具有相同类型的共用体变量相 互赋值;而对共用体变量的输入、输出及各种运算都是通过共用体变量的成员来实 现的。
例如,定义了d1为共用体变量,则d1.c、d1.i、d1.j分别表示引用共用体变量d1 的3个成员。
6.5 共用体类型
6.5.2 共用体类型的变量
3、结构体与共用体的比较
“共用体”和“结构体”的声明、定义变量的形式、变量的引用方法相 似,但有区别:
若把一个结构体数据的起始地址赋给一个指针变量,则该指针变量就指向这个结构 体数定据义。结构体指针变量的一般形式为:
struct 结构体名 *结构体指针变量名;
例如: struct Student *pstu; 指针变量pstu就可以用来指向struct Student类型的变量或数组元素。
6.4 结构体指针
定义的两个变量stu1和stu2都是struct Student结构体类型的,都具有struct Student类 型的结构:
6.2 结构体变量
6.2.1 定义结构体变量的方法
2、在声明结构体类型的同时定义结构体变量
这种方式,声明类型和定义变量一起 进行,能直接看到结构体的结构,较为直 观,在编写小程序时常用此方法。
也可以在声明枚举类型的同时,定义枚举变量:
enum Weekday{Sun, Mon, Tue, Wed, Thu, Fri, Sat} workday, restday;
或
enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat} workday, restday;
枚举变量只能取枚举声明中的某个枚举元素值:workday = Mon; restday = Sat;
6.5 共用体类型
6.5.3 共用体的应用举例
【例6.10】设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业、教研室4 项,学生有姓名、年龄、职业、班级4项。
思考与练习:根据声明的结构体,编程:输入人员数据, 再以表格输出。
6.6 枚举类型
在实际应用中, 如果一个变量只有几种可能的取值,例如一星期只有7天,那么该变量可 定义为“枚举(enumeration)类型”。
6.4 结构体指针
6.4.4 结构体指针数组及其应用
结构体指针数组可以存放多个结构体数据的指针(地址)。
思考与练习:
【例6.7】用结构体指针数组输出例6.5的结构体数组。 【例6.8】用结构体指针数组名作为函数参数,实现:输入若干名学生的 信息(学号、姓名、多门课成绩),然后分别按学号和按总分从高到低输出 所有学生的信息。
结构体变量(所有成员共存)所占的内存长度是各成员所占内存长度之和。 共用体变量(各个成员互斥),在任何时刻只能使用其中的一个成员。所占的 内存长度等于最长成员的长度,例如,共用体变量d1占4个字节(成员j的长度)。
共用体变量的地址和它的各成员的地址是同一地址。 例如:&d1和&d1.i、&d1.c、&d1.j相同。
C语言程序设计
教学内容:
第1章:C语言语法基础 第2章:C程序设计基础 第3章:利用数组处理同类型的批量数据 第4章:利用函数实现模块化程序设计 第5章:灵活使用指针 第6章:结构体、共用体、枚举类型及其应用 第7章:常用的三种线性数据结构 第8章:利用文件进行数据管理 第9章:嵌入式技术基础实践方法
则:枚举元素Sun=7,Mon=1,其后的元素按照顺序依次加1,如Fri=5。
2、只能把枚举元素赋予枚举变量,但不能把元素的数值直接赋予枚举变量。
例如:workday=Mon;
//正确
workday=1;
//错误
workday=(enum Weekday) 1; //正确(强制类型转换),相当于workday=Mon;
3、枚举元素是常量,不是变量,因此不能在程序中再对它赋值。
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(1)先声明共用体类型,再定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(2)在声明共用体类型的同时定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
第6章 结构体、共用体、枚举类型及其应用
【学习内容】
【学习目标】
6.1 结构体类型概述
1.掌握结构体类型的声明方法;
6.2 结构体变量
2.掌握结构体变量的定义、初始化及成员
6.3 结构体数组
引用方法;
6.4 结构体指针
3.掌握结构体数组及应用;
6.5 共用体类型
4.掌握结构体指针及应用;
6.6 枚举类型
6.3 结构体数组
6.3.2 结构体数组的初始化
对结构体数组,可以进行初始化赋值。 例如:
6.3 结构体数组
6.3.2 结构体数组的应用
【例6.2】计算学生的平均成绩,并统计不及格的人数。
6.3.2 结构体数组的应用
【例6.3】建立同学通讯录。
6.3 结构体数组
6.4 结构体指针
6.4.1结指构体向指结针构是体用变来指量向的结指构针体数据(结构体变量或结构体数组元素)的指针,
结构体变量成员的引用形式: 结构体变量名.成员名
例如: stu1.stu_ID stu2.sex
即第一名学生的学号 即第二名学生的性别
成员(分量)运算符 “.”的优先级最高。stu1.stu_ID作为一个整体看待。
若成员本身又是一个结构体类型,则必须逐级找到最低级的成员才能使用。 例如:stu1.birthday.month 为第1名学生出生的月份
“枚举”是指将变量的值一一列举出来,变量的值仅限于列举值的范围内。 声明枚举类型:enum Weekday {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
花括号中的Sun、 Mon、 …、 Sat称为枚举元素或枚举常量。 注意:枚举常量之间是用逗号间隔,而不是分号。 定义枚举变量:
6.4.1 指向结构体变量的指针
【例6.4】通过3种方式访问结构体变量中的成员。
若结构体指针变量指向了一结构体数据(结 构体变量或结构体数组元素),则访问结构体 数据的成员有3种形式:
(1)结构体变量名.成员名 或 结构体数组元 素名.成员名
(2)(*结构体指针变量名).成员名 (3)结构体指针变量名->成员名
d1 ={ 'a', 12, 345};
//错误,不能对变量整体赋值
d1.i = 12;
//将12赋给d1的成员i
d2=d1;
//同类型的共用体变量相互赋值
d[0].c = 'a';
//将'a' 赋给d[0]的成员c
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(3)共用体的所有成员都是从低地址开始存放的。 对其中的某个成员赋值,会覆盖其他成员相应字节上的值。 例如: d1.i = 0x12; d1.j = 0x345; d1.c = 'a'; 思考:变量d1存储单元中的值是多少?
6.4 结构体指针
6.4.2 指向结构体数组的指针
当结构体指针变量指向结构体数组中的某个元素时,结构体指针变量的值是 该结构体数组元素的起始地址。
【例6.5】用结构体指针变量输出结构体数组。
6.4 结构体指针
6.4.3 结构体指针变量作函数参数
【将例一6.6个】结计算构一体组数学据生传的递平给均另成一绩个和函不及数格时人,数若。采要用求“用地结址构传体指递针”变的量方作式函(数用参指数向编程。 结构体数据的指针变量作函数参数,将结构体数据的起始地址传递给形参),则会 减少时间和空间上的开销,大大提高程序执行效率。
6.5 共用体类型
6.5.3 共用体的应用举例
【例6.9】利用共用体类型测试CPU的大端、小端模式。
大端模式:数据的低字节(尾巴)保存在内存的高地址中,高字节保存在低地址中; 小端模式:数据的低字节(尾巴)提保示存:在地数内址组存,是的c从[低1低]地存地址放址中在开,高始高地存字址放节。,保即存c[在0]高存地放址在中低。 数据0x12345678(低字节为0x78)在内存中的大端、小端存储模式:
6.6 枚举类型
说明:
//声明枚举类型 //定义枚举类型变量
1、枚举元素表中的每一个枚举元素都代表一个整数,默认值依次为0、1、2、 3、…。如在上面的定义中,Sun=0,Mon=1,…,Sat=6。
若人为地指定枚举元素的数值:
enum Weekday{Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
union UData d1 = 'a';
//错误,初值必须用{ }括起来
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(2)共用体变量在程序中赋值
定义了共用体变量以后,只能对其成员赋值,不可对其整体赋值。同类型的共用 体变量可以相互赋值。
例如: union UData d1, d2,d[10]; //定义共用体类型的变量、数组
6.5 共用体类型
6.5.2 共用体类型的变量
4、共用体变量的赋值
(1)共用体变量的初始化赋值
定义共用体变量时,可以对变量赋初值,但只能对变量的一个成员赋初值,而不 能对所有的成员赋初值。
例如: union UData d1 = { 'a'};
// 'a'赋给变量d1的第1个成员c
union UData d1 = { 'a', 12, 345}; //错误,{ }中只能有一个值
6.5 共用体类型
6.5.1 共用体类型的概念
将变量c、i、j放在同一地址2000开始的内存单元中。这种使多个不同的变量 共用一段内存的结构,称为“共用体”或“联合体”——实现多个变量分时复用 内存。
声明一个共同体类型的一般形式为: union 共用体名 { 成员列表 };
6.5 共用体类型
6.5.2 共用体类型的变量
5.掌握共用体、枚举类型及应用;
6.7 用typedef声明新类型名 6.掌握typedef声明新类型名的方法;
6.1 结构体类型概述
前面学习的数组是将相同类型的多个数据组合在一起。 如果一名学生的信息:学号为整型,姓名为字符型,性别为字符型,成绩为实型,能 否用数组存放该学生的信息呢?
为解决这一问题,C语言允许用户自己建立由不同类型(或同类型)数据组成 的组合型数据结构——“结构体”。
6.2 结构体变量
6.2.声1 明定的义结构结体构类体型,变仅量相的当方于一法个模型,其中并无具体数据,系统并不对其分配内存空
间定。义1、系结统构先只体声对类明变型结量的构或变数量体组或类分数型配组,内。再存空定间义,结因构此体为了变能量在程序中使用结构体类型的数据,应当
这种方式,声明类型和定义变量分离,在 声明类型后可以随时定义变量,使用灵活。
6.2 结构体变量
6.2.2 结构体变量的初始化
和其他类型的变量一样,结构体变量可以在定义时进行初始化赋值。初始化 列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的成员。
6.2 结构体变量
6.2.3 结构体变量的引用
在定义结构体变量以后,便可引用该变量。C允许具有相同类型的结构体变量相互赋值; 而对结构体变量的输入、输出及各种运算都是通过结构体变量的成员来实现的。
6.2 结构体变量
6.2.3 结构体变量的引用
【例6.1】结构体变量的初始化和引用。
6.3 结构体数组
6.3.1一定个义结构结体构变体量数可组以存的放方一法名学生的信息,而结构体数组可以存放多名学生的
信息,结构体数组中的每个元素都是一个结构体类型的数据。
定义的结构体数组stu,共有5个元素,stu[0]~stu[4]。每个数组元素都是struct Student结构体类型的。
6.2 结构体变量
6.2.1 定义结构体变量的方法
3、不指定结构体名而直接定义结构体变量
这种方式,由于没有结构体名,因此 不能再用此结构体类型去定义其他变量, 实际应用较少。
6.2 结构体变量
6.2.1 定义结构体变量的方法来自说明:(12)结构体中的成员名也可与以程是序一中个其结它构变体量类同型名的,变但量二。者例代如表:不同的对象,互不干扰。
1、定义共用体变量的方法
与结构体变量类似,定义共用体变量有以下3种方法。
(3)不指定共用体名而直接定义共用体变量
6.5 共用体类型
6.5.2 共用体类型的变量
2、共用体变量的引用方法
在定义共用体变量以后,便可引用该变量。C允许具有相同类型的共用体变量相 互赋值;而对共用体变量的输入、输出及各种运算都是通过共用体变量的成员来实 现的。