版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 结构体、共用体及枚举类型,河南理工大学 南红艳,2020/7/10,Hongyan Nan,HPU,2,重点、难点,本章重点: 结构体类型及变量 结构体数组的使用 指针和结构体 共用体、枚举、用户自定义类型 本章难点: 结构体指针变量的引用 链表的建立、插入、删除、输出等操作 共用体类型的数据特点,2020/7/10,Hongyan Nan,HPU,3,在实际应用中,将具有不同类型的相关的数据项组成一个有机的整体,而构造的一种数据类型称为“结构(structure)”或“结构体”,在基本类型上自定义,如: 一个学生的基本信息有:学号、姓名、性别、年龄、成绩等,它们是一个有着内在联系整
2、体,用结构体类型变量就可以表示之,2020/7/10,Hongyan Nan,HPU,4,10.1 结构体变量的定义, 结构体 是一种构造数据类型,必须先定义后使用 结构体类型由若干成员组成 每一个成员可以是一个数据类型 结构体类型的定义,struct 结构体名 类型标识符 成员名表1; 类型标识符 成员名表2; ; 类型标识符 成员名表n; ;,关键字, 不能省略,合法标识符 可省,是成员类型 基本型或构造型,合法标识符 可与变量名相同,2020/7/10,Hongyan Nan,HPU,5,例 struct student int num; char name20; char sex; i
3、nt age; float score; struct date birthday; ;,是类型,不是变量名 不分配内存,例 struct date int month; int day; int year; ;,成员类型可以是任何已有类型,嵌套结构,结构体类型定义在函数之外时有全局作用域;定义在任一对花括号之内则有局部作用域,2020/7/10,Hongyan Nan,HPU,6,结构体变量的定义, 三种形式: 先定义结构体类型,再定义结构体变量 在定义结构体类型的同时定义结构体变量 直接定义结构体变量 说明: 类型与变量是不同概念 若两个结构体的成员类型、名称、个数相同,而名不同,则为两个
4、不同的结构类型 可将结构体类型的定义集中放到一个.h的头文件中,而后用include命令将该头文件包含到本文件中,以便结构体类型的装配、修改及使用,例: struct stu int num; char name20; char sex; int age; float score; struct date birthday; ; struct stu boy1,boy2;,编译时分配连续的内存为各成员所占字节总和 (4+20+1+4+4+12=45),例: struct stu int num; char name20; char sex; int age; float score; stru
5、ct date birthday; boy1,boy2;,例: struct int num; char name20; char sex; int age; float score; struct date birthday; boy1,boy2;,在后续程序中无法重新定义该结构体类型的新变量,2020/7/10,Hongyan Nan,HPU,7,10.2 结构体变量的引用和初始化, 结构体变量的引用方式:结构变量名.成员名 引用规则: 结构体变量不能整体引用,只能引用变量成员 嵌套结构体须逐级引用 对变量成员进行各种运算 可引用变量成员的地址和结构体变量的地址 两个类型相同的结构体变量可
6、相互赋值,成员运算符,优先级最高,左结合性,例: boy1.num /* 第一个人的学号 */ boy2.sex /* 第二个人的性别 */,如: printf(%d,%s,%c,%d,%f,boy1);() printf(%d,%s,%c,%d,%f,boy1.num,,boy1.sex,boy1.age,boy1.score);(),如: boy1.birthday.month () boy1.birthday (),例: sum=boy1.age+boy2.age; boy1.age+;,例: scanf(%d, (),例:boy1=boy2;,2020/7/10,Ho
7、ngyan Nan,HPU,8,结构体变量的初始化, 形式一: 形式二: 形式三:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ; struct 结构体名 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,Wen Li,M,19,2 Bei Road;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct student int num; cha
8、r name20; char sex; int age; char addr30; stu1=112,Wen Li,M,19,2 Bei Road;,struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,Wen Li,M,19,2 Bei Road;,2020/7/10,Hongyan Nan,HPU,9,例10.1 #include main() struct stu int num; char name20; cha
9、r sex; int age; float score; boy2,boy1=102,Zhan pin,M,20,78.5; boy2=boy1; printf(Number:%dnName:%sn,boy2.num,); printf(Sex:%cnage:%dScore:%4.1fn,boy2.sex,boy2.age,boy2.score); ,运行结果: Number:102 Name:Zhan pin Sex:M Age:20 Score:78.5,2020/7/10,Hongyan Nan,HPU,10,有: struct student int num; cha
10、r name20; char sex; int age; stu3;,10.3 结构体数组, 定义的三种形式: 形式一: 形式二: 形式三: 初始化: 分行初始化: 顺序初始化: 引用方式:数组名下标.成员名,struct student int num; char name20; char sex; int age; ; struct student stu30;,struct student int num; char name20; char sex; int age; stu30;,struct int num; char name20; char sex; int age; stu3
11、0;,struct student int num; char name20; char sex; int age; ; struct student stu=100,Wan Li,M,20, 101,Li Gan,M,19,110,Lu Yan,F,19;,全部初始化时维数可省,struct student int num; char name20; char sex; int age; ; struct student stu=100,Wan Li,M,20, 101,Li Gan,M,19,110,Lu Yan,F,19;,则有: stu1.age+; strcpy(,
12、ZhaoDa);,给stu0赋予姓名应用strcpy赋值 而=ZhaoDa (),包括全部成员的值,2020/7/10,Hongyan Nan,HPU,11,例10.2 计算学生的平均成绩和不及格的人数,#include struct stu int num; char name20; char sex; float score; boy5= 11,Li pi,M,45, 12,Zha pi,M,62.5, 13,He fa,F,92.5, 14,Chen li,F,87, 15,Wa mi,M,58 ;,main() int i,c=0; float ave,s=0; fo
13、r(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; ave=s/5; printf(ave=%fnnum=%dn,ave,c); ,运行结果: ave=69.000000 num=2,2020/7/10,Hongyan Nan,HPU,12,例 统计后选人选票,#include struct person char name20; int count; leader3=Li,0,Zhan,0,Wan,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_n
14、ame); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,2020/7/10,Hongyan Nan,HPU,13,10.4 结构体指针变量, 结构体指针变量:指向结构体变量或结构体数组的指针(首地址),简称为结构指针 定义形式:struct 结构体名 *结构体指针变量名; 赋值:结构体指针变量名= 用结构体指针变量引用成员的形式: 结构体指针变量-成员名 或:(*结构体指针变量).
15、成员名 所以:,例:struct stu boy,*pstu;,例:pstu= (),指向运算符,左结合 优先级高于自增/减运算,编译系统不给结构体名分配空间,例:+pstu-num +(pstu-num) pstu-num5 (pstu-num)5,例:(*pstu).num,括号不可少 否则:*pstu.num *(pstu.num),结构体指针变量-成员名(*结构体指针变量).成员名结构体变量名.成员名,例:pstu-num *(pstu).num boy.num,2020/7/10,Hongyan Nan,HPU,14,例10.3 结构指针变量的引用,#include struct s
16、tu int num; char name20; char sex; float score; boy=12,Zhan pi,M,78.5,*pstu; main() pstu= ,运行结果: Num=12 Name= Zhan pi Sex=M Score=78.500000 Num=12 Name= Zhan pi Sex=M Score=78.500000 Num=12 Name= Zhan pi Sex=M Score=78.500000,2020/7/10,Hongyan Nan,HPU,15,指向结构体数组的指针,例10.4 用指针变量输出结构体数组,#include struct
17、 stu int num; char name20; char sex; float score; boy5= 11,Liu pi,M,45,12,Zha pi,M,62.5,13,He fa,F,92.5, 14,Chen li,F,87,15,Wa mi,M,58 ; main() struct stu *ps; printf(NotNamettSextScoretn); for(ps=boy;psnum,ps-name,ps-sex,ps-score); ,运行结果: No Name Sex Score 11 Liu pi M 45 12 Zha pi M 62.5 13 He fa F
18、 92.5 14 Chen li F 87 15 Wa mi M 58,注意: (+ps)-num先ps+1,后得元素中num的成员值; (ps+)-num先得元素中num的值,后ps+1,指向boy1; +ps-num+(ps-num)先得值,后使值+1,即11+1=12,2020/7/10,Hongyan Nan,HPU,16,#include struct stu int num; char name20; char sex; float score; st; struct stu newst() struct stu newst; scanf(%d, ,struct stu int n
19、um; char name20; char sex; float score; ; void list(struct stu *p) printf(Number=%dtName=%sn,p-num,p-name); printf(Sex=%ctScore=%fn,p-sex,p-score); main() struct stu student=12,Zhan pi,M,78.5; list( ,10.5 结构体与函数, 结构体变量作函数参数:将全部值顺序传递给形参。效率低 返回结构体值的函数: 结构体指针作函数参数:,struct stu int num; char name20; char
20、 sex; float score; ; void list(struct stu student) printf(Number=%dtName=%sn,student.num,); printf(Sex=%ctScore=%fn,student.sex,student.score); main() struct stu student=12,Zhan pi,M,78.5; list(student); ,例10.5 显示学生的基本信息,运行结果: Number=12 Name=Zhan pi Sex=M Score=78.500000,外部类型,例10.6 用函数输入
21、数据,运行结果: 11 Li pi M 76 Num=11 Name=Li pi Sex=M Score=76.000000,例10.7 指针作参数,运行结果: Number=12 Name=Zhan pi Sex=M Score=78.500000,2020/7/10,Hongyan Nan,HPU,17,10.6 位段结构体, 位段结构体:以位为单位来指定其成员所占内存长度的结构体,其成员称为位段(或位域) 优势:节省存储空间,使处理简便 位段结构体类型的定义形式: struct 位段结构体名 类型标识符 位域名1:位域长度; 类型标识符 位域名2:位域长度; 类型标识符 位域名n:位域长
22、度; ; 位段结构体变量的定义:同结构体变量定义方式,例: struct bs int a:8; int b:2; int c:6; ;,例: struct bs int a:8; int b:2; int c:6; data;,共四个字节,2020/7/10,Hongyan Nan,HPU,18, 说明: 位域的类型一般为unsigned或int类型,VC中也可为char、short、long等;其长度为整型常量表达式 一个位段须存储在同一个存储单元中,不能跨两个单元 通过使用空域可使下一个位域从下一个存储单元开始存放 位域的长度不能大于一个存储单元的长度 不能定义位域数组 位域可以没有位域
23、名,无名的位域不能使用,只用来调整位置,例: struct bs unsigned a:4; unsigned :0; unsigned b:4; unsigned c:4; ;,空域:跳过本字节剩余位,从下一字节 开始存放,例: struct k int a:1; int :2; int b:3; ;,这2位不能使用,如:struct pd unsigned a:2; unsigned b:2; unsigned c:4; int i; da;,共8B,共8B,2020/7/10,Hongyan Nan,HPU,19,位域的引用, 位域的引用:位段结构体变量名位域名 可用%d,%x,%u和%
24、o等格式以整数形式输出位域的值,#include main() struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf(%d,%d,%dn,bit.a,bit.b,bit.c); pbit= ,运行结果: 1,7,15 0,3,15,给三个位域赋值, pbit-b=pbit-b, pbit-c=pbit-c|1;,bs类型指针变量,给指针变量 赋值,重新给三个 位域赋值,以指针变量引用,注意:位段允许的最大值,如:bit.b=9; 应=7,2020/7/1
25、0,Hongyan Nan,HPU,20,10.7 链表, 链表是一种常用的、能够实现动态存储分配的数据结构,能使链表中各元素(结点)的数据存放在不连续的单元中 最简单的链表结构有: 头指针head指向首结点 若干个结点,每个结点包括两个域: 数据域存放用户的各种数据 指针域指向下一个结点 最后一个结点的指针域为NULL(空指针),2020/7/10,Hongyan Nan,HPU,21, 说明: 链表中各个结点在内存中是不连续的,若无头指针或链表中间断开,则整个链表或断开后的结点无法访问 链表中每个结点都具有相同的数据类型,所以用结构体来做结点最合适,例: struct stu int nu
26、m; char name20; struct stu *next; ;,构成数据域,作指针域,next 是指向该结构体类型的指针变量,用来存放下一个结点的起始地址,实现将各结点连接成链,struct stu a,b,c,*p,*head; head=,2020/7/10,Hongyan Nan,HPU,22,10.8 共用体, 共用体是使几个不同的变量共占同一段内存的结构,其类型定义: union 共用体名 类型标识符 成员名表1; 类型标识符 成员名表2; ; 类型标识符 成员名表n; ; 变量的定义方式同结构体 共用体变量中的所有成员占用同一段内存空间,其大小等于最长成员所占的字节数,例:
27、 union data int i; char s6; float f; ;,例: union data int i; char s6; float f; ; union data a,b,c;,例: union data int i; char s6; float f; a,b,c;,例: union int i; char s6; float f; a,b,c;,占6B,2020/7/10,Hongyan Nan,HPU,23, 共用体变量的引用:只能引用成员 形式一:共用体变量名.成员名 形式二:共用体指针变量名-成员名 形式三: (*共用体指针变量名).成员名,例10.14 #incl
28、ude main() union char a4; struct bt char c1; char c2; char c3; char c4; chs; d; strcpy(d.a,deab); printf(%c,%cn,d.chs.c2, d.chs.c3); ,运行结果: e,a,共用体变量的地址与其各个成员的地址相同, char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%onch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1); ,运行结果: i=60501 ch0=101,ch1=141
29、 ch0=A,ch1=a,C语言引入共用体的目的之一是可以将一种类型的数据不需通过强制类型转换而作为另一种类型数据使用,2020/7/10,Hongyan Nan,HPU,25,例10.15 main() union char a; short b; long c; uu; uu.c=0 x12345678; printf(n1:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c); uu.a=0 x61; printf(n2:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c); uu.b=0 x1234; printf(n3:a=%x,b=%x,c=%lx,uu.a,u
30、u.b,uu.c); ,运行结果: 1:a=78,b=5678,c=12345678 2:a=61,b=5661,c=12345661 3:a=34,b=1234,c=12341234,00010010 00110100 01010110 01111000,12 34 56 78,61,34,12,2020/7/10,Hongyan Nan,HPU,26,不能整体引用共用体变量,只能引用其成员 共用体变量任何时刻只有一个成员存在 可以用一个共用体变量为另一个变量赋值 共用体变量中起作用的成员是最后一次存放的成员 在定义共用体变量时只能初始化第一个成员 共用体变量的指针与其各成员的指针都是同一地
31、址 结构体与共用体可相互嵌套 新的ANSI C允许共用体变量作为函数参数,共用体类型的特点,例 union int i; char ch; float f; a; a=1; (),例 union int i; char ch; float f; a=1,a,1.5; (),float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=a.f; ( ),2020/7/10,Hongyan Nan,HPU,27,10.9 枚举类型, 枚举:指将某变量可能的值一一列举出来,这种变量可定义成枚举类型,其类
32、型的定义形式: enum 枚举名枚举常量1,枚举常量2,枚举常量n; 变量的定义同结构体 枚举类型是一种基本数据类型,而不是一种构造类型 枚举类型的变量取值不能超过定义的范围,enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat; enum weekday workday,week_end; 或: enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Satworkday,week_end; 或:enumSun,Mon,Tue,Wed,Thu,Fri,Satworkday,week_end;,workday=Sun; ( ) workday=Sunday; (),2020/7/10,Hongyan Nan,HPU,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 20608-2026智能运输系统自适应巡航控制系统性能要求与检测方法
- GB/T 47111-2026公园城市建设评价指南
- DB21T+2508-2026生猪生产监测技术规范
- 灭火实操培训课件
- 铝门窗生产加工工艺培训课件
- 企业中层管理人员管理能力测试题及答案-中层干部测试
- 三重一大决策制度董事会
- 2026中兴通讯智能制造基地招聘备考题库附答案详解(综合题)
- 2026年公司安全生产责任制及责任目标考核制度模版
- 2026云南保山市天立学校后勤员工招聘备考题库附参考答案详解(典型题)
- 初中地理八年级《中国的气候特征及其影响》教学设计
- 广州大学《电磁场与电磁波》2023-2024学年第二学期期末试卷
- 中国家居照明行业健康光环境与智能控制研究报告
- 主动防护网系统验收方案
- 基于BIM的ZN花园14号住宅楼工程清单与招标控制价编制
- 压缩机操作工岗位操作技能评估
- 河北省石家庄第二中学2025-2026学年高一上数学期末联考试题含解析
- XMTE-3000系列智能温度控制器使用说明书
- 诊所医疗投诉管理制度
- 2025年全球AI编程(AI Coding)市场洞察研究报告
- 设备投资分成协议书
评论
0/150
提交评论