版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章结构体与共用体C语言程序设计四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第1页。本章内容结构体(结构structure)类型共用体(联合union)类型结构体变量、结构体数组、结构体指针向函数传递结构体用结构体指针实现动态数据结构链表的概念及操作原理四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第2页。思考一个问题在程序里表示一个人(姓名、年龄、性别…),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?表8-1某学校学生成绩管理表学号姓名性别入学时间计算机原理英语数学音乐1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任盈盈女1999789587905……6……四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第3页。数组的解决方法int studentId[30];/*最多可以管理30个学生,每个学生的学号用数组的下标表示*/char studentName[30][10]; char studentSex[30][2];
int timeOfEnter[30];/*入学时间用int表示*/int scoreComputer[30];/*计算机原理课的成绩*/int scoreEnglish[30];/*英语课的成绩*/ int scoreMath[30]; /*数学课的成绩*/int scoreMusic[30]; /*音乐课的成绩*/四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第4页。intstudentId[30]={1,2,3,4,5,6};char studentName[30][10]={{"令狐冲"},{"林平之"},{"岳灵珊"},{"任盈盈"}};char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}};int timeOfEnter[30]={1999,1999,1999,1999};int scoreComputer[30]={90,78,89,78};int scoreEnglish[30]={83,92,72,95};int scoreMath[30]={72,88,98,87};int scoreMusic[30]={82,78,66,90};
数组的解决方法四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第5页。数据的内存管理方式90788978……83927295……72889887……82786690……1234……令狐冲林平之岳灵珊任盈盈……男男女女……1999199919991999……数组的解决方法四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第6页。数据的内存管理方式90788978……83927295……72889887……82786690……1234……令狐冲林平之岳灵珊任盈盈……男男女女……1999199919991999……数组的解决方法分配内存不集中,寻址效率不高对数组进行赋初值时,容易发生错位结构显得比较零散,不容易管理四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第7页。希望的内存分配图
1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任盈盈女199978958790四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第8页。结构体的解决方法structSTUDENT
{
intstudentID;/*每个学生的序号*/
charstudentName[10];/*每个学生的姓名*/ charstudentSex[4];/*每个学生的性别*/ int timeOfEnter;/*每个学生的入学时间*/ int scoreComputer;/*每个学生的计算机原理成绩*/ int scoreEnglish;/*每个学生的英语成绩*/ int scoreMath; /*每个学生的数学成绩*/ int scoreMusic;/*每个学生的音乐成绩*/
};struct
STUDENT是一个类型struct
STUDENT
students[4];students[0].studentID
students[0].scoreComputer它们都是变量,一般称为结构的成员变量四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第9页。用户自定义的数据类型结构体:把关系紧密、且逻辑相关的多种不同类型的变量,组织到统一的名字之下占用相邻的一段内存单元共用体:把情形互斥、但逻辑相关的多种不同类型的变量,组织到统一的名字之下占用同一段内存单元,每一时刻只有一个数据起作用四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第10页。10010LiFunM1887.5Beijingnumnamesexagescoreaddr形成一个样板用于生成结构体变量struct
结构体名{
类型关键字
成员名1;
类型关键字成员名2;…...
类型关键字成员名n;};构成结构体的变量称结构体成员(member)也称域(filed)结构体类型的定义Don’tforgetthesemicolon!!structstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];};四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第11页。10010LiFunM1887.5Beijingnumnamesexagescoreaddrstructstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];};struct
结构体名{
类型关键字
成员名1;
类型关键字成员名2;…...
类型关键字成员名n;};结构体类型的定义只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第12页。先定义结构体类型再定义变量名在定义类型的同时定义变量直接定义结构体变量(不出现结构体名)structstudent
student1,student2;structstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];}student1,student2;struct
{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];}student1,student2;结构体变量的定义四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第13页。定义自己的类型名struct
student
student1,student2;/*Itworks*/student
student1,student2;/*Canthiswork?*/
typedef
struct
student
STUD;STUD
student1,student2;
/*Itworks!*/typedef为一种已存在的类型定义一个新名字STUD与struct
student类型是同义词structstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];};四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第14页。struct类型的特点是一个普通的类型可以定义该类型的变量、数组、指针……可以做函数的参数类型和返回值类型它的成员可以是任意类型基本类型、数组、指针、结构体、共用体……struct类型的变量两个结构体变量之间可以相互赋值所以做为函数的参数时,是传值调用可以取地址&不可直接参与算术和比较运算面向对象和数据库是struct思想的发展四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第15页。结构体的内存占用double占用内存字节数=8struct类型用内存字节数=?是所有成员变量的内存总和吗?structnumber{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structnumber));用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型)8Why?四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第16页。结构体的内存占用事实上所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的不同的编译器、平台,对齐方式会有变化结构体变量的成员的存储对齐规则是与机器相关的具有特定数据类型的数据项的大小也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的ifchichf非所有成员变量的内存总和8个字节四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第17页。structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
structSTUDENTstu[30];
结构体数组学号姓名性别入学时间计算机原理年月日英语数学音乐structdate{
intyear;
intmonth;
intday;};
结构体定义可以嵌套四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第18页。structSTUDENTstu[30]={{1,"令狐冲","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳灵珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};初始化结构体数组structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第19页。structSTUDENTstu[30]={{1,"令狐冲","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳灵珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};初始化1令狐冲男9019998268072822林平之男7819998269288783岳灵珊女8919998267298664任盈盈女781999826958790建立了数据库中的多条记录,每条对应一个学生信息四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第20页。结构体变量的指针pStustustructSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
struct
STUDENT
stu;/*定义结构体变量*/struct
STUDENT
*pStu;/*定义结构体指针*/
pStu=&stu;成员1成员2成员3成员4成员5成员6成员7成员8四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第21页。pStustustructSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
struct
STUDENT
stu;/*定义结构体变量*/struct
STUDENT
*pStu;/*定义结构体指针*/
pStu=&stu;成员1成员2成员3成员4成员5成员6成员7成员8如何访问结构体的成员通过stu和成员运算符访问结构体成员stu.studentID=1;通过pStu和指向运算符访问结构体成员(*pStu).studentID=1;pStu->studentID=1;四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第22页。structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
struct
STUDENT
stu;/*定义结构体变量*/struct
STUDENT
*pStu;/*定义结构体指针*/
pStu=&stu;如何访问嵌套的结构体的成员stu.
timeOfEnter.
year=1999;(*pStu).
timeOfEnter.
year=1999;pStu->
timeOfEnter.
year=1999;structdate{
intyear;
intmonth;
intday;};
四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第23页。思考题structpoint
{
intx;
inty;
};
structrect
{
structpointpt1;
structpointpt2;
};structrectrt;structrect*rp=&rt;下面表达式哪些合法?rt.pt1.xrp.pt1.x(*rp).pt1.x(&rt)->pt1.xrp->pt1.xrt->pt1.x上面合法的表达式都是等价的吗?四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第24页。structSTUDENTstu[4]={{1,"令狐冲","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳灵珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};结构体数组的指针pStustu[4]structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
structSTUDENT*pStu;/*定义结构体指针*/pStu=stu;/*相当于pStu=&stu[0];*/stu[0]stu[1]stu[2]stu[3]四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第25页。使用pStu++,使pStu指向stu[i]pStu->studentID等价于
stu[i].studentID如何访问结构体数组元素的成员pStustu[4]structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
structSTUDENT*pStu;/*定义结构体指针*/pStu=stu;/*相当于pStu=&stu[0];*/stu[0]stu[1]stu[2]stu[3]四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第26页。向函数传递结构体向函数传递结构体的单个成员复制单个成员的内容函数内对结构内容的修改不影响原结构向函数传递结构体的完整结构?向函数传递结构体的首地址?四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第27页。structdate{
intyear;
intmonth;
intday;};voidfunc(structdate
p){
p.year=2000;
p.month=5;
p.day=22;}main(){
structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);func(d);
printf(“%d,%d,%d\n”,d.year,d.month,d.day);}1999,4,231999,4,23结构体变量
做函数参数四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第28页。structdate{
intyear;
intmonth;
intday;};voidfunc(structdate
*p){
p->year=2000;
p->month=5;
p->day=22;}main(){
structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);func(&d);
printf(“%d,%d,%d\n”,d.year,d.month,d.day);}1999,4,232000,5,22结构体指针
做函数参数指针做函数形参实参必须为地址值四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第29页。structdate{
intyear;
intmonth;
intday;};structdatefunc(structdate
p){
p.year=2000;
p.month=5;
p.day=22;}main(){
structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);
d=func(d);
printf(“%d,%d,%d\n”,d.year,d.month,d.day);}结构体变量
做函数返回值存在一个错误四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第30页。structdate{
intyear;
intmonth;
intday;};structdatefunc(structdate
p){
p.year=2000;
p.month=5;
p.day=22;
returnp;}main(){
structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);
d=func(d);
printf(“%d,%d,%d\n”,d.year,d.month,d.day);}1999,4,232000,5,22结构体变量
做函数返回值四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第31页。向函数传递结构体向函数传递结构体的完整结构复制整个结构体成员的内容,多个值函数内对结构内容的修改不影响原结构内容传递更直观,但开销大向函数传递结构体的首地址用结构体数组/结构体指针做函数参数仅复制结构体的首地址,一个值修改结构体指针所指向的结构体的内容指针传递效率高四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第32页。思考下面的结构是什么意思?structtemp
{
int data;
structtemppt;
};CB下的错误提示:field'pt'hasincompletetypeTC下的错误提示:Undefinedstructure‘temp’StructuresizetoolargeVC下的错误提示:'pt'usesundefinedstruct‘temp’下面的结构是什么意思呢?structtemp
{
intdata;
structtemp*pt;
};结构体声明时不能包含本结构体类型成员系统将无法为这样的结构体类型分配内存
可包含指向本结构体类型的指针变量四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第33页。共用体,或称为联合(Union)structnumber{
shorti;
charch;
floatf;};0x0037b00unionnumber{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structnumber));ichf8个字节ichf4个字节printf("%d\n",sizeof(unionnumber));四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第34页。共用体,或称为联合(Union)sizeof(unionnumber)取决于占空间最多的那个成员变量0x0037b00同一内存单元在每一瞬时只能存放其中一种类型的成员;起作用的成员是最后一次存放的成员不能作为函数参数不能进行比较操作,只能对第一个成员初始化f4个字节四川大学《c语言程序设计》课件-第8章-结构体与共用体全文共39页,当前为第35页。structperson{
charname[20];
charsex;
intage;
union
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艺术品交易鉴定规则
- 如何做一个企业规划
- 课件重要理念教学课件
- 洁净区的管理
- 初中日语人教版七年级全册+八年级一二单元单词听写 课件
- 端午节团队活动策划
- 儿童抽搐应急措施
- 快速性心律失常药物治疗
- 初中地理教案课后反思
- 级神奇的纸说课稿
- 古建筑工程修缮施工组织设计
- 艺术装置搭建方案
- 新版药品批发企业质量管理体系文件大全
- 警察给小学生讲课课件
- 山东省临沂市兰山区2023-2024学年八年级上学期期中数学试题
- 四年级期中家长会课件
- 《COPD诊疗新进展》课件
- 礼修于心 仪养于行 课件-2023-2024学年高一上学期文明礼仪在心中养成教育主题班会
- 第七章 成组技术
- 组织行为学全套课件(罗宾斯版)
- 防腐设备设备安全操作规程
评论
0/150
提交评论