版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,只能定义单一的数据类型,反映事物单一属性,第7章:结构体与共用体,学习的意义,如定义学生成绩: float score;,能定义复杂的数据类型,反映事物多个属性,如定义学生信息: struct STU char no9; /学号 char name12; /姓名 char sex; /性别 float score; /成绩 student;,结构体与共用体丰富了C语言对数据信息的处理能力。 离开了结构体与共用体,很多信息的描述是无法进行定义,更无法进行处理的。 计算机中的信息表示更多是由结构体与共用体来定义的,象数据结构课程中的链表、树、图等 可以更好地理解数据库中的记录的含义, 为C+语言
2、中类的概念的理解提供了帮助。,学习目标,熟练掌握结构体、共用体和枚举数据类型的定义方法; 熟练掌握结构体、共用体和枚举变量的定义和引用方法; 掌握结构数组的定义及其应用; 掌握指向结构的指针的概念及其应用; 了解线性链表的创建、插入节点、删除节点和撤销节点的算法; 掌握利用结构体与共用体作为函数参数和返回值的函数定义方法;,学习内容,结构体与共用体概述 结构体 结构体类型的定义 结构体变量的定义和引用 结构体变量的赋值 简化结构体类型名 结构体数组 线性链表 联合体 联合体类型的定义 联合体变量的定义和引用 联合体变量的赋值 位域 枚举类型变量的定义和引用 结构体与共用体应用综合举例 本章小结
3、,7.1 结构体,结构体是一种结构体与共用体 用途:把不同类型的数据组合成一个整体-自定义数据类型 引入结构体的好处:加强数据项之间的联系,如学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。,独立的变量表示:,结构体变量表示:,char no9; /学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩,1、结构体类型的定义,struct 结构体类型名 数据类型名1 成员名1; 数据类型名2 成员名
4、2; 数据类型名n 成员名n; ;,struct是关键字, 不能省略,合法标识符 可省:无名结构体,成员类型可以是 基本型或构造型,以分号;结尾,例1: struct Student_Info char no9; /学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 ;,例2: struct Date int year; /年 int month; /月 int day; /日 ;,在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行
5、定义,就象一次定义多个变量一样。,struct Student_Info char no9; /学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 ;,struct Student_Info char no9, name20, sex; unsigned int age, classno; float grade; ;,struct Date int year; /年 int month; /月 int day; /日 ;,struct Date i
6、nt year, month, day; ;,注意:结构类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式,不分配内存,只有用它来定义某个变量时,才会为该变量分配结构类型所需要大小的内存单元。所占内存的大小是它所包含的成员所占内存大小之和。,2、结构体变量的定义和引用,struct 结构体类型名 数据类型名1 成员名1; 数据类型名n 成员名n; ; struct 结构体类型名 变量名列表;,结构体变量的定义,间接定义法:先定义结构类型,再定义结构变量,struct student;,struct Student_Info student1, student2;,一次定义多个结构体类
7、型变量,定义指向结构体类型的指针变量,struct Student_Info *pstu;,间接定义法中几种错误的结构体变量的定义方法,没有结构体类型名,Student_Info student;,缺省struct关键字,struct Point p; struct Point int x, y; ;,结构类型Point定义在后,错啦!,2、结构体变量的定义和引用,struct 结构体类型名 数据类型名1 成员名1; 数据类型名n 成员名n; 变量名列表;,结构体变量的定义,直接定义法:定义结构体类型的同时定义结构体变量,struct Student_Info char no9; /学号 ch
8、ar name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 student1, student2;,struct char no9; /学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 student1, student2;,或,无名结构体定义,变量只能一次,几点说明:,(1) 结构体类型与结构体变量概念不同 类型: 不分
9、配内存; 变量: 分配内存 类型: 不能赋值、存取、运算; 变量: 可以,(2) 结构体可以嵌套,(3) 结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰,(4) 结构体类型及变量的作用域和生存期与基本类型变量相同,struct Point int x, y; ; struct Img int tag; struct Img *pimg; /正确,可以包含自身类型的指针 struct Img img; /错误,不能包含自身类型的变量 ;,struct Student_Info student; char name20;,结构体变量的引用,引用规则,结构体变量不能整体引用
10、,只能引用变量成员,引用方式:,结构体变量名.成员名 /非指针型结构体变量的引用,可以将一个结构体变量赋值给另一个结构体变量,结构体嵌套时逐级引用,结构体指针-成员名 或 (*结构体指针).成员名 /指针型结构体变量的引用,成员(分量)运算符 结合性:从左向右,成员(分量)运算符 结合性:从左向右,结构体变量名.成员名.子成员名最低级子成员名,注意:在利用指针引用结构体成员时,-和之间不能有空格。,3、结构体变量的赋值,结构体变量初始化赋值,先定义结构体类型,再定义结构体变量时赋初值,注意:赋初值时, 中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。,struct Studen
11、t_Info stu = 20020306, ZhangMing, M, 18, 1, 90;,struct Student_Info stu = 18, ZhangMing, M, 20020306, 1, 90;,3、结构体变量的赋值,结构体变量初始化赋值,定义结构体类型的同时,定义结构体变量并赋初值,struct Date int year, month, day; birthday = 1986, 12, 10;,struct int year, month, day; birthday = 1986, 12, 10;,或,struct Student_Info char no9; /
12、学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 student = 20020306, ZhangMing, M, 18, 1, 90;,strcpy (stu1.no, stu.no); strcpy (, ); stu1.sex = stu.sex; stu1.age = stu.age; stu1.classno = stu.classno; stu1.grade = stu.grade;,struct S
13、tudent_Info stu; strcpy (stu.no, 20020306); strcpy (, ZhangMing); stu.sex = M; stu.age = 18; stu.classno = 1; stu.grade = 90; struct Student_Info stu1; stu1 = stu;,3、结构体变量的赋值,结构体变量在程序中赋值,如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员逐一赋值,或者用已赋值的同类型的结构体变量对它赋值,memcpy (,4、简化结构体类型名,利用typedef语句为结
14、构体类型起别名,这样可使定义结构体类型的变量显得更为简洁,同时也增加程序的易读性。,typedef语句的格式为:,typedef 类型名 类型名的别名;,必须是已经定义的数据类型名或C语言提供的基本类型名,必须是合法的标识符,通常用大写字母来表示,必须以分号结尾,typedef int INTEGER; /INTEGER是别名 typedef char * STRING /STRING是别名 struct teacher_info char name20, char sex, unit30; unsigned int age, workyears; float salary; ; typede
15、f struct teacher_info TEACHER; /TEACHER是别名 INTEGER a; /相当于int a; STRING str; /相当于char *str; TEACHER t; /相当于struct teacher_info t;,typedef char ARRAY81; /ARRAY是别名 ARRAY str; /相当于char str81;,5、结构体数组,结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。,结构体数组的定义,三种形式:,形式一: struct Student_Info char no9, name20, sex; unsigned
16、int age, classno; float grade; ; struct Student_Info stu10;,形式三: struct char no9, name20, sex; unsigned int age, classno; float grade; stu10;,形式二: struct Student_Info char no9, name20, sex; unsigned int age, classno; float grade; stu10;,结构体数组与二维表的对应关系,结构体数组就相当于一张二维表,一个表的框架对应的就是某种结构体类型,表中的每一列对应该结构体的成
17、员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。,结构体类型Student_Info,struct Student_Info char no9; char name20; char sex; unsigned int age; unsigned int classno; float grade; stu10;,结构体数组的初始化,初始化的格式为:,struct 结构体类型名 ; struct 结构体类型名 结构体数组size = 初值表1, , 初值表n;,struct 结构体类型名 结构体数组size = 初值表1,初值表2, , 初值表n;,或,结构体
18、数组的引用,引用格式为:,结构体数组名下标.成员名;,struct Student_Info char no9; char name20; char sex; unsigned int age; unsigned int classno; float grade; stu10;,strcpy (, WangFei);,stu1.grade+;,printf (%s, );,【例】统计侯选人选票。,#include #include struct person char name20; /候选人姓名 int count; /得票数 leader3 = Li,
19、0, Zhang, 0, Wang, 0 ;,void main ( ) int i, j; char leader_name20; while (1) /统计候选人得票数 scanf (%s, leader_name); /输入候选人姓名 if (strcmp(leader_name, 0) = 0) /输入为0结束 break; for (j = 0; j 3; j+) /比较是否为合法候选人 if (strcmp(leader_name,) = 0) /合法 leaderj.count+; /得票数加1 for (i = 0; i 3; i+) /显示后选人得票数
20、 printf (%5s : %dn, , leaderi.count); ,7.4 联合体,结构体与共用体,也叫共用体 用途:使几个不同类型的变量共占一段内存(相互覆盖),1、联合体类型的定义,union 联合体类型名 数据类型名1 成员名1; 数据类型名2 成员名2; 数据类型名n 成员名n; ;,类型定义不分配内存,共占4字节 sizeof(union UData) = sizeof(f),联合体的大小是成员中占内存最大的成员的大小,union UData short i; char ch; float f; ;,2、联合体变量的定义和引用,联合体变量的定义,形式
21、一: union data short i; char ch; float f; a, b;,形式二: union data short i; char ch; float f; ; union data a, b, *p, d3;,形式三: union short i; char ch; float f; a,b,c;,共用体变量任何时刻 只有一个成员存在,共用体变量定义分配内存, 长度=最长成员所占字节数,联合体变量的引用,联合体变量名.成员名,联合体指针名-成员名 或 (*联合体指针名).成员名,3、联合体变量的赋值,联合体变量的初始化赋值,定义联合体变量时可以对变量赋初值,但只能对变量
22、的第一个成员赋初值,不可象结构体变量那样对所有的成员赋初值。,union UData short i; char ch; float f; ; union UData data = 10; /10赋给成员i union UData data = A; /A赋给成员i,即i的值为65(A的ASCII码) union UData data = 10, A, 12.5; /错误, 中只能有一个值 union UData data = 10; /错误,初值必须用 括起来,3、联合体变量的赋值,联合体变量在程序中赋值,定义了联合体变量以后,如果要对其赋值,则只能通过对其成员赋值,不可对其整体赋值。,具有
23、相同联合体类型的变量之间也可以相互赋值。,union UData short i; char ch; float f; ; union UData data, *p, d10; data = 10; /错误 data = 10; /错误 data.i = 10; /正确,将10赋给data的成员i p = /正确,将12.5赋给data的成员f d0.ch = A /正确,将A 赋给d0的成员ch,union UData data1 = 10, data2; data2 = data1; /正确,几点说明:,由于联合体变量的各成员共享同一地址的内存单元,所以在对其成员赋值的某一时刻,存放的和起
24、作用的将是最后一次存入的成员值,对联合体变量的某个成员赋值时,也改变了其它成员的值,因为它们共享一个内存地址。,由于联合体变量所有成员共享同一内存空间,因此联合体变量与其各成员的地址相同。,union UData data; data.i = 10; data.ch = A; data.f = 12.5; 则data.f的值才是有效的成员的值。,union UData data; data.i = 10; data.ch = A; 则data的成员i的值将变为65(A的ASCII码值)。,union UData data; 则 short a; char ch; d = 0 xFFF11241
25、; printf (d.ch = %c d.a = %X d.L = %Xn, d.ch, d.a, d.L); d.a+; printf (d.ch = %c d.a = %X d.L = %Xn, d.ch, d.a, d.L); ,0XFF,0XF1,0X12,0X41,运行结果: d.ch = A d.a = 1241 d.L = FFF11241,d.ch = B d.a = 1242 d.L = FFF11242,7.6 枚举类型变量的定义和引用,如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓“枚举”,顾名思义,就是把这种类型数据可取的值一一列举出来。一个枚举型变量取值
26、仅限于列出值的范围。枚举数据类型通常的定义形式为:,enum 枚举类型名 枚举元素表 ;,由多个标识符组成,标识符之间用逗号分开,定义枚举类型:enum weekday sun, mon, tue, wed, thu, fri, sat;,定义枚举类型变量:enum weekday today, nextday;,enum weekday sun, mon, tue, wed, thu, fri, sat today, nextday;,enum weekday sun, mon, tue, wed, thu, fri, sat today, nextday;,today = sun; nex
27、tday = mon; if (today = sat) nextday = sun;,today = 100;,C编译对枚举元素实际上按整型常量处理,当遇到枚举元素列表时,编译程序就把其中第一个标识符赋0值,第二、三、个标识符依此赋1,2,。,enum weekday sun, mon, tue, wed, thu, fri, sat today, nextday;,today = sun; printf(today = %d, today);,运行结果: today = 0,if (today = 6) nextday = 0;,if (today = sat) nextday = sun
28、;,可以在枚举类型定义时指定枚举元素的值,enum weekday sun = 7, mon = 1, tue, wed, thu, fri, sat;,注意: 枚举元素是常量,在程序中不可对它赋值。 例如:sun = 0; mon = 1;将产生错误。,定义枚举类型的好处:,用标识符表示数值增加了程序的可读性,清晰,不清晰,可限制了变量的取值范围,如today只能取sunsat中的值,7.7 结构体与共用体应用综合举例,结构体与共用体的应用是广泛的,特别是结构体类型的应用更是如此。因为现实世界中很多信息都是一些基本信息的综合体,要表示这类信息,必须要用到结构体类型,否则对这类信息的处理将变得
29、非常复杂,甚至无法进行处理。下面的实例是一个非常有代表性的程序,它所包含的知识从某种意义上来说是对我们前面所学的核心内容的集中体现,主要知识包括: 结构体类型的定义及应用; 枚举类型的定义及应用; 结构体指针(或结构体数组)的应用; 二级指针的应用; 结构体指针作为函数参数; 返回结构体指针的函数; 二级指针与动态内存分配; 动态内存的释放; 结构体数组的排序方法等。,本章小结:,结构体、联合体及枚举类型都是用户自定义的数据类型,它们均属于结构体与共用体,是用户定义新数据类型的重要手段。结构和联合有很多的相似之处,它们都由成员组成。成员可以具有不同的数据类型。成员的表示方法相同。都可用间接和直接两种方式作变量说明。 在结构体中,各成员都占有自己的内存空间,它们是同时存在的。一个结构体变量的总长度等于所有成员长度之和。在联合体中,所有成员不能同时占用它的内存空间,它们不能同时存在。联合体变量的长度等于最长的成员的长度。 “.”是成员运算符,可用它表示成员项,成员还可用“-”运算符来表示。 结构体变量可以作为函数参数,函数也可返回指向结构体的指针变量。而联合体变量不能作为函数参数,函数也不能返回指向联合体的指针变量。但可以使用指向联合体变量的指针,也可使用联合体数组。 结构定义允许嵌套,结构体中也可用联合体作为成员,形成结构体和联合体的嵌套。 链表是一种重要的数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年林业局自然保护地管理岗面试题库
- 2026年机关干部公文排版格式专项测试题
- 2026年文学常识及文化素养提升题
- 2026年邮政业扫黄打非知识试题
- 2026年公务员申论热点问题解析
- 9.1自然特征与农业 教学设计-2025-2026学年人教版地理八年级下册
- 2026年通信行业面试问题及答案解析
- 2026年区划系统版行政区划调整舆情应对知识试题
- 2026年市场营销策略与品牌建设面试提问
- 2026年退役军人法律援助工作站建设与权益维护实务试题
- 辅警招聘考试300题及答案
- 高中心理健康教育-【9 化解冲突“圈”住朋友】
- 安全标志平面布置图
- 锂离子电池及锂离子电池正极材料钴酸锂的研发及产业化项目环境影响报告书
- 一-工地试验室建设及管理培训方案课件
- 生物表面活性剂鼠李糖脂
- GA 1809-2022城市供水系统反恐怖防范要求
- 宏观经济形势及投资分析课件
- GB/T 14194-2017压缩气体气瓶充装规定
- 材料学 印模材料-口腔专业课课件-口腔材料
- MicrosoftAzure云安全应用场景教学课件
评论
0/150
提交评论