C++课件第7章 结构体、共用体和枚举类型
C程序设计(第四版)第7章结构体与共用体
7.1.1
结构体类型的定义
结构体在说明和使用之前,必须先由用 户自己定义。结构体定义的一般形式如下: struct 结构体名 { 成员类型说明符 成员项1; 成员类型说明符 成员项2; …… 成员类型说明符 成员项n; };
其中: 1、struct是C语言中定义结构体的关键字。 2、成员类型说明符是说明每个成员项的数 据类型,可以是基本数据类型,也可以是数组 类型,还可以是另一个已定义的结构体类型。 3、成员名可以和程序中的变量名相同,两 者不代表同一对象。 4、要注意,在结构体定义中的右括号后应 该有分号。
7.1.6
指向结构体的指针
一个结构体类型的数据在内存中都占据一定 的存储空间,我们可以定义一个指针来指向该 结构体类型的数据,该指针变量称为指向结构 体的指针,简称之为结构体指针。我们可以通 过结构体指针来访问结构体类型的数据,如结 构体变量、结构体数组。指向结构体的指针变 量说明形式如下: struct 结构体类型名 *结构体指针变量名;
main() { struct student stu1; struct student *p; p=&stu1; stu1.num=50201001; gets(); stu1.score=89.5;
printf(“No:%ld\nName:%s\nScore:%4.1f\n”,stu1 .num,,stu1.score); printf(“No:%ld\nName:%s\nScore:%4.1f\n”,(*p). num,(*p).name,(*p).score);
3、结构体数组应用举例 【例7-2】现有三个候选人(每个候选人的ID 号分别是1、2、3),选举人投票进行选举, 编写程序统计出每个候选人的得票结果。 程序如下: #define NUM 30 #include <stdio.h> struct elector { int id; char name[20]; int count;
结构体、共用体与枚举
9.1.2 结构体变量的说明
结构体变量的说明有三种方法: 1.用已定义的结构体类型名定义变量。
例如: struct person student,worker;
/* 定义了两个结构体变量student和worker */
用上面的结构体类型还可再定义变量: struct person men,women;
student.birthday.year
/* 基本成员year ,相当于一个整型变量 */
9.1.4 结构体变量的引用
2.结构体变量的赋值、输入和输出 结构体变量的输入和输出也都只能对其成员进行
3.同一类型的结构体变量可相互赋值 由于结构体各个成员的类型不同,对结构体变量 赋值也只能对其成员进行 同类型的两个结构体变量之间可以整体赋值 (请比较数组之间不能整体赋值) stud1=stud 2;
9.1 结构体
【问题】什么是结构体类型?什么是结构体变量?结 构体类型与数组类型有什么区别和联系?
姓名 年龄 性别 身份 民族 住址 电话
证号
号码
(字符数组) (整型) (字符) (长整型) (字符) (字符数组) (长整型)
9.1.1 结构体类型的定义
结构体类型的定义形式为: struct 类型名 {成员项表列}; 例如包含上图中全部类型数据的结构体类型的定义如下: struct person /* 结构体类型名 */ { char name[20]; /* 以下定义成员项的类型和名字 */ int age; char sex; long num; char nation; char address[20]; long tel; };
本课件PPT仅供大家学习使用 学习完请自行删除,谢谢! 本课件PPT仅供大家学习使用 学习完请自行删除,谢谢! 本课件PPT仅供大家学习使用 学习完请自行删除,谢谢! 本课件PPT仅供大家学习使用 学习完请自行删除,谢谢!
结构体、共用体和枚举型
优缺点比较
优点
节省内存空间;可以方便地处理多种数据类型。
缺点
由于所有成员共享同一块内存空间,因此每次只能使用其中一个成员;使用不 当可能导致数据丢失或混乱。
优缺点比较
优点
增加了代码的可读性和可维护性;提供了类型检查,减少了 错误的可能性。
缺点
相对于整数类型,枚举型的处理速度较慢;占用内存空间相 对较大。
枚举型
枚举型通常用于定义一组命名的 整数值,这些值可以增加代码的 可读性和可维护性。例如,可以 使用枚举型来定义一周中的天数 或一个月中的月份。
优缺点比较
优点
可以方便地组合和管理多个不同类型 的数据;提供了数据的封装和隐藏, 增加了代码的安全性;可以方便地传 递和返回多个值。
缺点
相对于基本数据类型,结构体的处理 速度较慢;占用内存空间相对较大。
共用体在节省内存空间中的应用
节省存储空间
共用体允许在相同的内存位置存储不同的数据类型,通过共享内 存空间来节省存储空间。
实现多态性
共用体可以在不同的上下文中表示不同的数据类型,从而实现一 种多态性的效果。
处理异构数据
当需要处理不同类型的数据时,可以使用共用体来统一表示这些 数据,简化数据处理的过程。
实现多态性
通过共用体,可以在相同 的内存空间中存储不同类 型的数据,从而实现多态 性。
方便数据处理
在某些情况下,使用共用 体可以更方便地处理数据。
共用体的声明与定义
声明
定义
初始化
访问成员
注意事项
在C语言中,可以使用 `union`关键字来声明一 个共用体。例如: `union Data { int i; float f; char str[20]; };`
C++课件 第七章 结构体、共同体和枚举
总结
我们深入学习了C++中的结构体、共同体和枚举,并了解了它们的定义、使用和区别。通过此章的学习,我们 掌握了更多编程的技巧和灵活性。
练习题
Question 1
如何定义一个包含姓名、年龄和分数的结构体?
Question 2
请解释什么是枚举类型,它与结构体的区别是什么?
成员的访问和赋值
学习如何通过结构体变量访问和赋值结构体的成员。
结构体数组与共同体
结构体数组
掌握如何定义和使用结构体数组,处理多个结构体 对象的同时。
共ห้องสมุดไป่ตู้体
学习共通体的定义和使用,可以在同一内存地址存 储不同类型的数据。
枚举类型
1
定义和使用
了解如何定义和使用枚举类型,使用符
枚举成员
2
号常量表示一组相关的常量值。
学习如何使用枚举成员,为常量赋予更
加直观的语义。
3
枚举的好处
了解枚举类型在代码编写和代码可读性 方面的优势。
结构体、共同体和枚举的区别和联系
1 区别
详细探讨结构体、共同体 和枚举之间的差异,如内 存分配方式和使用场景。
2 联系
强调结构体、共同体和枚 举的共同点,如都是用于 数据类型的封装和组织。
3 灵活性和应用
参考资料
C++结构体和共同体
此篇文章说明了C++中如何定义和使用结构体和 共同体。
C++枚举类型
了解C++中枚举类型的定义和学习,学习枚举的 使用场景。
C++课件 第七章 结构体、 共同体和枚举
C语言第七章结构体共用体枚举类型数据
第七章结构体、共用体和枚举类型数据1.教学内容:§7.1 结构体类型概述7.1.1 结构体的概念及其定义§7.2 结构体类型变量的定义和引用7.2.1 定义结构体类型变量的方法7.2.2 结构体变量的初始化7.2.3 结构体变量的引用7.2.4 结构体的输入和输出§7.3 结构体数组7.3.1 结构体数组的定义方法7.3.2 结构体数组的初始化7.3.3 结构体数组的引用§7.4 结构体变量作为函数参数以及返回的结构体类型值的函数7.4.1 结构体变量作为函数参数7.4.2 返回的结构体类型值的函数§7.5 结构体变量与指针7.5.1 指向结构体变量的指针7.5.2 指向结构体数组的指针7.5.3 用指向结构体变量的指针作函数参数§7.6 动态存储分配---链表7.6.1 动态存储分配和链表的概念7.6.2 用包含指针项的结构体变量构成结点7.6.3 用于动态存储分配的函数7.6.4 链表应用举例§7.7 共用体类型数据7.7.1 共用体的概念7.7.2 共用体变量的引用7.7.3 共用体变量的应用§7.8枚举类型数据§7.9 用TYPEDEF定义类型2.教学目的及要求:1) 掌握结构体类型的概念和定义方法,结构体变量的定义和引用2) 掌握指向结构体变量的指针变量的概念和应用3) 掌握链表的概念和应用2)掌握共用体类型的概念和应用3)掌握枚举类型的概念和应用3.教学重点:结构体变量的定义和引用,结构体变量与指针,共用体引用第七章结构体、共用体和枚举类型数据§7.1 结构体类型概述7.1.1 结构体的概念及其定义结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。
其定义形式:结构体类型不同于基本数据类型,其特点有:⑴由若干数据项组成,每一个数据项都属于一种已有定义的类型。
每个数据项称为一个结构体的成员,也可称为“域”。
VC++程序设计 -第七章结构体、共同体和枚举类型
int id_no; int eng, phy, math; float ave; } stu1, stu2;
第7章-结构体、共用体与枚举类型
7.1 结构体类型 7.2 结构体数组 7.3 结构体指针变量
7.4 链表
7.5 共用体
7.6 枚举类型
2019/1/23 1
6.1 结构体类型
概述
有时,需将不同类型的数据组合成一个有机的 整体,以便于引用。这些数据是相互联系的。 如一个学生的有关信息:
num name 10010 Li min sex M age 18 addr Dalian
2019/1/23
st1.birthday.year
12
结构体变量的成员的访问(续)
两个结构体变量之间可以进行整体赋值。 但对结构体变量进行输入和输出时,只能 是针对每一个成员来进行。 struct student st3; st3=st1; printf("%d",st3);//错误
2019/1/23
2019/1/23 24
链表结构(1)
2019/1/23
25
链表结构(2)
2019/1/23
26
单链表结点的类型定义
struct 结构名 表示成员指针所指对 象的类型就是自身结 { 点类型。 数据成员列表; struct 结构名 *指针名; };
示例: struct student { long num; double score; struct student *next; 2019/1/23 };
7.2 结构体数组
1.结构体数组的定义
struct student { int num; char name[20]; double score; } stu1[5]; struct student stu2[5];
2019/1/23 16
课件:结构体_枚举_共用体
共用体
问题
请s计truc算t {出下面结构体定义的数据长str度uct:{
float a;
union {
union {
char b[2];
char b[4];
float c;
float c;
int d;
int d;
}e;
}e;
} s;
char f[4];
} s;
共用体
问题 假设s的结构体如下所示: 1. s的结构体长度是? 2. 以下哪些语句是不合法的? (a)s.a = 100; (b)s.len = 2; (c)s.u.rec.len = 2; (d)s.u.radius = 5; (e)s.u.cir = 5;
leftpoint.x = 123; points[1].y = 0;
结构体-基础知识
问题
1.下面的结构体使用有没有错误?
typedef struct { int a; struct NODE *b; struct NODE *c;
} node_s; node_s.a = 0;
struct node_s{ int a; struct NODE *b; struct NODE *c;
结构体
1) nodes =
2) nodes.a =
3) nodes[3].a =
4) nodes[3].c =
5) nodes[3].c->a =
6) nodes.a =
7) (*nodes).a =
8) nodes->a=
9)nodes[3].b->b =
10)&nodes =
11)&nodes[3].a =
}; node_s.a = 0;
结构体联合体和枚举类型
程序演示
[例7.1]程序பைடு நூலகம்示
返回例题
返回7.1.2目录
7.1.3 结构数组
《 语 言 程 序 设 计 》
(Visual C++ 6 0 环 境 ) .
返回本节目录
数组元素是结构体类型数据,这时的数组就是结构数组。
C
1.结构数组的定义 2. 结构数组的初始化 【例7.2】
1.结构数组的定义
《 C 语 言 程 序 设 计 》
(Visual C++ 6 0 环 境 ) .
返回7.1.3目录
结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。 例如: struct stu { int num; char name[20]; char sex; float score; }; struct stu student[3]; 也可以直接定义一个结构数组或省略结构体名。
【例7.3】
返回1目录
【例7.3】(1)
《 C 语 言 程 序 设 计 》
(Visual C++ 6 0 环 境 ) .
【例7.3】通过结构指针引用结构体成员。程序名为l7_3.cpp。 #include "stdio.h" struct stu { int num; char name[20]; char sex; float score; }student1={102,"Zhang ping",'M',78.5},*s; main() { s=&student1; /*给结构指针变量赋值*/ printf("Number=%d\tName=%s\t",student1.num, ); printf("Sex=%c\tScore=%f\n", student1.sex, student1.score); printf("Number=%d\tName=%s\t",(*s).num,(*s).name); printf("Sex=%c\tScore=%f\n",(*s).sex,(*s).score); printf("Number=%d\tName=%s\t",s->num,s->name); printf("Sex=%c\tScore=%f\n",s->sex,s->score); }
W07章结构体联合体与枚举类型.ppt
7.3 共同体 union
计算机的容量随着科技的发展已越来越大,人们对存储器是否够 用已较少关注。但是,十几年前却并不乐观。为此,人们想了许多 办法来提高资源的利用率,采用共同体类型的数据就是一例。
我们知道,一个程序中有若干个语句,计算机在执行某个语句时, 就要访问这个语句中的变量。而其它语句以及其中的其它变量却处 于临时静止状态。尽管是临时静止,如果不是寄存器变量,它占用 的资源却要等到所在函数执行结束才释放。
我们的教材中又将共同体称为联合体。它的定义形式与结构体很 相似,只不过把struct改成union。例如:
定义联合体的 指令标识符
联合体的 类型标识符
不定义联合体 类型
union data { char a; int b[3]; float s; }s;
union data { char a; int b[3]; float s; };
s.num=2095105;
... ...
}
s
num
name sex age score
addr
l i xi n
Nanjing
struct student
传递数据时,系统是这样寻址的:
{unsigned long num; char name[6];
char sex; int age; float score; char addr[8];
union { char a; int b[3]; float s; }s;
联合体变量
联合体的成员
直接定义s为 联合体变量
7.3 共同体 union
所谓共同体,本例中就是指下面三个成员共同享用一个存储区。 存储区的大小则由三者中用量最大者决定。在某一个时刻,当变量 a使用存储区时,数组s和变量b就不能使用,要让出来。这样就使 该存储区的空间获得充分利用,达到节省资源的目的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程 序 设 计 基 础
Visual C++
结构体类型变量的定义
3、直接定义结构体类型的变量 struct { char name[20]; int age; char sex; int num; char nation; int education; char address[20]; int tel; }student, worker ; 此时直接定义了student和worker两个变量,但没有定义此 结构体类型的名字,因此不能再用它来定义其它变量。
2013-9-10 版权所有© 南京理工大学 王芳 17
枚举类型
1、枚举元素为常量,不可赋值运算。 sun=0; mon=1; 2、在定义枚举类型的同时,编译程序按顺序给每个枚举元 素一个对应的序号,序号从0开始,后续元素依次加1。 enum weekday {sun, mon, tue, wed, thu, fri, sat}; 0 , 1, 2, 3, 4, 5, 6
2013-9-10 版权所有© 南京理工大学 王芳 2
和基本数据类型相比,结构体类型的特点如下:
程 序 设 计 基 础
Visual C++
1、它由若干个数据项组成,每一种数据项都属于一种已有 定义的类型,每一个数据项称为一个结构体的成员。 2、结构体类型并非只能有一种,而可以有很多种,这是与 基本类型不同的。 3、定义一个结构体类型,并不意味着系统将分配一段内存 单元来存放各数据项成员,这里只是定义类型而不是定 义变量。一种类型只表明一种特征,如果以后定义变量 为该类型,才占据存储单元。 4、系统没有预先定义结构体类型,凡需使用结构体类型数 据的,必须在程序中自己定义。 定义一个结构体类型的一般形式为: struct 结构体名 {成员项表列};
姓名 年龄 性别 身份证 民族 文化程度 住址 电话号码
数组
整型
字符型
整型
字符型
整型
数组
整型
C++语言用下面的形式定义上表中所示的“结构体”类型:
struct person { char name[20]; int age; char sex; int num; char nation; int education; char address[20]; int tel; };
程 序 设 计 基 础
Visual C++
第7章 结构体、共用体和枚举类型
本章主要内容: 1、结构体的定义和引用; 2、共用体的定义和引用; 3、枚举类型
2013-9-10 版权所有© 南京理工大学 王芳 1
结构体的概念及其定义
程 序 设 计 基 础
Visual C++
构造型数据类型常被用来处理多个相关的数据。数组 用于组织处理多个同类型的数据,而结构体则用于处理不 同类型的数据。如:
2013-9-10 版权所有© 南京理工大学 王芳 4
程 序 设 计 基 础
Visual C++
结构体类型变量的定义
2、在定义结构体类型的同时定义结构体变量; struct person { char name[20]; int age; char sex; int num; char nation; int education; char address[20]; int tel; }student, worker ; 它的一般形式为: struct 结构体名 {成员表列 }变量名表列; 这是第一种形式的紧凑形式,既定义了类型,又定义了变量。
2013-9-10
程 序 设 计 基 础
Visual C++
x in y
4 2 1 8
a b b
输出:4
8
版权所有© 南京理工大学 王芳
16
枚举类型
程 序 设 计 基 础
Visual C++
所谓枚举是指变量的值可以一一列举出来,变量的值只 限于列举出来的值的范围。若一个变量只有几种可能的值, 则可以定义为枚举类型。 枚举类型的定义和变量说明的方式如下: 定义和说明分开 enum 枚举类型名{枚举值1,枚举值2,…,枚举值n}; enum 枚举类型名 变量名表; 例:enum Days{Sun, Mon, Tues, Wed, Thuray, Sat}; Days today; 直接定义枚举变量 enum {枚举值1,枚举值2,……,枚举值n}变量名表; 例:enum Days{Sun, Mon, Tues, Wed, Thuray, Sat}today; 不定义枚举类型名,直接定义枚举类型变量 例:enum {Sun, Mon, Tues, Wed, Thuray, Sat}today;
程 序 设 计 基 础
Visual C++
2013-9-10
版权所有© 南京理工大学 王芳
10
结构体数组的初始化
结构体数组各元素是连续存放的,不能对结构体数组作 整体操作。对结构体数组可以作初始化赋值 。 struct stu { int num; char name[20]; char sex; float score; }boy[5]={ {101,"Li ping","M",45}, {102,"Zhang ping","M",62.5}, {103,"He fang","F",92.5}, {104,"Cheng ling","F",87}, {105,"Wang ming","M",58} } ;
2013-9-10 版权所有© 南京理工大学 王芳 8
程 序 设 计 基 础
Visual C++
结构体类型变量的引用
程 序 设 计 基 础
Visual C++
1、引用结构体变量中的一个成员。 格式:结构体变量名.成员名 其中,“.”称为成员运算符。 例如:, student.num 如果一个结构体类型中又嵌套了一个结构体类型,则访 问一个成员时,应采用逐级访问的方法,直到得到所访问 的成员为止。 例如:student.birthday.year 2、可以将一个结构体变量作为一个整体赋给另一个具有相 同类型的结构体变量。 3、C++语言不允许把一个结构体作为一个整体进行输入或 输出操作。 4、结构体变量可以作为函数的参数,函数也可以返回结构 体类型的值。结构体变量作为函数参数时,实参和形参结 合时属于值传递。
程 序 设 计 基 础
Visual C++
答案:6141
2013-9-10 版权所有© 南京理工大学 王芳 15
共用体的定义和引用(实例)
void main(void) { union EXAMPLE { struct { int x, int y;}in; int a,b; }e; e.a=1; e.b=2; e.in.x=e.a*e.a; e.in.y=e.b+e.b; cout<<e.in.x<<„\t‟<<e.in.y<<endl; }
2013-9-10 版权所有© 南京理工大学 王芳 14
程 序 设 计 基 础
Visual C++
共用体的定义和引用(实例)
例2:若有如下定义: union un { short int a; char c[2]; } w; w.c[0]='A'; w.c[1]='a'; 则执行cout<<<<hex<<w.a后,结果是什么? 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 w.c[0]=„A‟ w.c[1]=„a‟
2013-9-10 版权所有© 南京理工大学 王芳 7
程 序 设 计 基 础
Visual C++
结构体类型变量的初始化
和其它数据类型类似,也可对结构体类型的变量进行初 始化。方法是用花括弧将每个成员的值括起来。 例如: struct stud { char name[20]; int num; int age; char sex; float score; }a={“zhang san”, 980131,19, ‟M‟, 90};
程 序 设 计 基 础
Visual C++
姓 名
年 龄
ห้องสมุดไป่ตู้
职 业
单位
“职业”一项可分为“教师”和“学生”两类。 对“单 位”一项教师应填入某系某教研室,学生应填入班级编号。 班级可用整型量表示,教研室只能用字符类型。要求把这 两种类型不同的数据都填入“单位”这个变量中,就必须 把“单位”定义为包含整型和字符型数组这两种类型的 “联合体”。
程 序 设 计 基 础
Visual C++
当对全部元素作初始化赋值时,也可不给出数组长度 。
2013-9-10 版权所有© 南京理工大学 王芳 11
共用体的定义
共用体是一种多变量共享存储空间的构造类型,它允许 几种不同类型的变量共享同一段存储空间。 在实际应用中有很多这样的例子。例如学校的教师和学 生要填写以下表格:
2013-9-10 版权所有© 南京理工大学 王芳 9
结构体数组
C++语言允许使用结构体数组,即数组中的每一个元素 都是一个结构体变量。 常用结构体数组来表示具有相同数据结构体的一个群体。 如一个班的学生档案,一个车间职工的工资表等。 结构体数组的定义方法 1、先定义结构体类型,再用它定义结构体数组; 2、在定义结构体类型的同时定义结构体数组; 3、直接定义结构体数组而不定义类型名。