版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章结构体与共用体C语言程序设计本章内容结构体(结构structure)类型共用体(联合union)类型结构体变量、结构体数组、结构体指针向函数传递结构体用结构体指针实现动态数据结构链表的概念及操作原理思考一个问题在程序里表示一个人(姓名、年龄、性别…),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?表8-1某学校学生成绩管理表学号姓名性别入学时间计算机原理英语数学音乐1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任盈盈女1999789587905……6……数组的解决方法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]; /*音乐课的成绩*/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};
数组的解决方法数据的内存管理方式90788978……83927295……72889887……82786690……1234……令狐冲林平之岳灵珊任盈盈……男男女女……1999199919991999……数组的解决方法数据的内存管理方式90788978……83927295……72889887……82786690……1234……令狐冲林平之岳灵珊任盈盈……男男女女……1999199919991999……数组的解决方法分配内存不集中,寻址效率不高对数组进行赋初值时,容易发生错位结构显得比较零散,不容易管理希望的内存分配图
1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任盈盈女199978958790结构体的解决方法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它们都是变量,一般称为结构的成员变量用户自定义的数据类型结构体:把关系紧密、且逻辑相关的多种不同类型的变量,组织到统一的名字之下占用相邻的一段内存单元共用体:把情形互斥、但逻辑相关的多种不同类型的变量,组织到统一的名字之下占用同一段内存单元,每一时刻只有一个数据起作用10010LiFunM1887.5Beijingnumnamesexagescoreaddr形成一个样板用于生成结构体变量struct
结构体名{
类型关键字
成员名1;
类型关键字成员名2;…...
类型关键字成员名n;};构成结构体的变量称结构体成员(member)也称域(filed)结构体类型的定义Don’tforgetthesemicolon!!structstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];};10010LiFunM1887.5Beijingnumnamesexagescoreaddrstructstudent{
intnum;
charname[20];
charsex;
intage;
floatscore;
charaddr[30];};struct
结构体名{
类型关键字
成员名1;
类型关键字成员名2;…...
类型关键字成员名n;};结构体类型的定义只定义了数据的形式,即声明了一种复杂的数据类型,并未生成任何变量。先定义结构体类型再定义变量名在定义类型的同时定义变量直接定义结构体变量(不出现结构体名)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;结构体变量的定义定义自己的类型名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];};struct类型的特点是一个普通的类型可以定义该类型的变量、数组、指针……可以做函数的参数类型和返回值类型它的成员可以是任意类型基本类型、数组、指针、结构体、共用体……struct类型的变量两个结构体变量之间可以相互赋值所以做为函数的参数时,是传值调用可以取地址&不可直接参与算术和比较运算面向对象和数据库是struct思想的发展结构体的内存占用double占用内存字节数=8struct类型用内存字节数=?是所有成员变量的内存总和吗?structnumber{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structnumber));用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型)8Why?结构体的内存占用事实上所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的不同的编译器、平台,对齐方式会有变化结构体变量的成员的存储对齐规则是与机器相关的具有特定数据类型的数据项的大小也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的ifchichf非所有成员变量的内存总和8个字节structSTUDENT{
int studentID;
char studentName[10];
char studentSex[4];
structdatetimeOfEnter;
int scoreComputer;
int scoreEnglish;
int scoreMath;
int scoreMusic;};
structSTUDENTstu[30];
结构体数组学号姓名性别入学时间计算机原理年月日英语数学音乐structdate{
intyear;
intmonth;
intday;};
结构体定义可以嵌套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;};
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建立了数据库中的多条记录,每条对应一个学生信息结构体变量的指针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成员8pStustustructSTUDENT{
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;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;};
思考题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上面合法的表达式都是等价的吗?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]使用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]向函数传递结构体向函数传递结构体的单个成员复制单个成员的内容函数内对结构内容的修改不影响原结构向函数传递结构体的完整结构?向函数传递结构体的首地址?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结构体变量
做函数参数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结构体指针
做函数参数指针做函数形参实参必须为地址值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);}结构体变量
做函数返回值存在一个错误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结构体变量
做函数返回值向函数传递结构体向函数传递结构体的完整结构复制整个结构体成员的内容,多个值函数内对结构内容的修改不影响原结构内容传递更直观,但开销大向函数传递结构体的首地址用结构体数组/结构体指针做函数参数仅复制结构体的首地址,一个值修改结构体指针所指向的结构体的内容指针传递效率高思考下面的结构是什么意思?structtemp
{
int data;
structtemppt;
};CB下的错误提示:field'pt'hasincompletetypeTC下的错误提示:Undefinedstructure‘temp’StructuresizetoolargeVC下的错误提示:'pt'usesundefinedstruct‘temp’下面的结构是什么意思呢?structtemp
{
intdata;
structtemp*pt;
};结构体声明时不能包含本结构体类型成员系统将无法为这样的结构体类型分配内存
可包含指向本结构体类型的指针变量共用体,或称为联合(Union)structnumber{
shorti;
charch;
floatf;};0x0037b00unionnumber{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structnumber));ichf8个字节ichf4个字节printf("%d\n",sizeof(unionnumber));共用体,或称为联合(Union)sizeof(unionnumber)取决于占空间最多的那个成员变量0x0037b00同一内存单元在每一瞬时只能存放其中一种类型的成员;起作用的成员是最后一次存放的成员不能作为函数参数不能进行比较操作,只能对第一个成员初始化f4个字节structperson{
charname[20];
charsex;
intage;
uni
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第3节 人类的起源与进化课件
- 公共设施维护安全施工方案
- 2024年二手房买卖合同(一次性付款模式)
- 2024年合同相对性原则在买卖合同中的体现
- 2024年修订版:图形设计软件购买合同
- Airbnb房屋出租合同注意事项
- 2024年CT图像分析购买合同
- 青少年法律意识培养方案
- 学校防台防汛应急预案方案
- 山楂病虫害防治技术培训
- 35KV变电站管理制度和规程
- 期末测试(试题)五年级上册信息技术粤教版
- 牛人总结雅思7.5以上经验63大页超详细
- 单句与复句的转换课件
- 龙氏正骨推拿手法课件
- 利尿实验(2010)课件
- 安全总监安全职责
- 云南白族课件
- 热爱劳动 从我做起-主题班会课件
- 消防应急预案组织结构图
- 企业安全知识竞赛题库
评论
0/150
提交评论