




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章结构体与共用体学习目标掌握结构体类型的基本概念、结构体类型变量的定义及简单应用。基本掌握结构体类型变量参与函数调用的方法。了解链表,动态存储空间的申请与释放了解共用体的概念主要内容结构体类型的概念结构体数组结构体与函数8.1结构体一.结构体类型的定义
结构体类型是由不同类型的数据组合而成的。设通过学号、姓名、性别、年龄和入学成绩来描述一个学生:以标识符number(字符串)表示学号、name(字符串)表示姓名、sex(字符)表示性别、age(整型)表示年龄和score(整型)表示入学成绩。由这些不同类型的数据组合在一起,描述学生这一特定类型的对象。称这种新的数据类型为结构体类型,根据其所描述的对象,将其命名为student结构体类型。定义结构体类型的格式:
struct结构体类型名
{
结构体成员表列
};例如:定义student结构体类型的语句:
structstudent{charnumber[6];charname[20];charsex;intage;intscore;};其中,struct为定义结构体类型的关键字,student为所定义的结构体类型名。结构体类型名由用户命名,但须符合标识符的命名规则。花括号内所定义的变量称为结构体成员,它们构成了所定义的结构体类型的特征。结构体类型student的特征由结构体成员number[]、name[]、sex、age和score共同描述。最后,以“;”表示定义结构体类型语句结束。
二、结构体变量的定义和引用
student是由用户定义的数据类型,与int、char、float等类型说明符一样,本身不能直接参与数据处理,必须通过定义student类型的变量,才能参与程序运行。
定义结构体类型变量的格式为:
struct结构体类型名变量名;
例如,语句:structstudents1,s2;定义了二个student类型的变量s1和s2,并且由C编译程序为s1、s2分配存储单元,假定存储单元的起始地址为2000H,则s1的存储情况如图所示:(转后)结构体变量s1在内存中的存储情况成员age占4字节成员number占6字节成员sex占1字节成员score占4字节成员name占20字节2000H2005H2006H
2019H201AH201BH201EH201FH2022H定义结构体类型的又一种格式(定义结构体类型的同时定义结构体类型的变量)struct结构体类型名
{
结构体成员表列
}变量名表列;例如:
structstudent{charnumber[6];charname[20];charsex;intage;intscore;}s1,s2;
在定义结构体类型变量的同时对其初始化对结构体类型变量的初始化就是用初始化数据对结构体变量相应的成员作初始化。【例8-1】结构体变量的初始化。执行语句:
structstudent{charnumber[6];charname[20];charsex;intage;intscore;}s1={"00001","Peter",'m',19,250},s2={"00002","Betty",'m',18,268};后,结构体变量s1、s2的成员被赋予相应的值。例如:s1的成员number[]的值为“00001”,age的值为19,结构体变量s2的成员name[]的值为"Betty"、score的值为268。【例8-2】假设学生的入学成绩由语文成绩、数学成绩和外语成绩构成,分别以标识符score1、score2和score3
表示,则可以将入学成绩定义为结构体类型score,并重新定义结构体类型student:
structscore{intscore1;intscore2;intscore3;};structstudent{charnumber[6];charname[20];charsex;intage;structscorestscore;}s1={"00001","Peter",'m',19,{75,82,93}},s2={"00002","Betty",'m',18,{81,94,93}};先定义结构体类型score结构体类型score的变量stscore是结构体类型student中的成员2.结构体变量的引用在C程序中,不允许引用结构体变量整体,只能通过结构体变量访问和引用其成员。引用结构体变量成员的格式:结构体变量名.成员名
以【例8-1】中的结构体变量s1和s2为例:的值为字符串常量"Peter",s2.sex的值为字符常量'm'。再以【例8.2】中的结构体变量s1和s2为例:s1.stscore.score1的值为75,s2.stscore.score3的值为93。由s1.stscore访问s1的成员stscore,再由stscore.score1访问stscore的成员score1
说明:
在C程序中,结构体变量成员可以参与同类型变量所能进行的各种运算和操作。【例8-3】参考例8-1中student类型的定义,以表的形式输出学生的信息。
#include<stdio.h>
voidmain()
{structstudent{charnumber[6];charname[20];charsex;intage; intscore;}s1={"00001","Peter",'m',19,250},s2={"00002","Betty",'f',18,268};printf("NumberNameSexAgeScore\n");printf("__________________________________\n");printf("%s%s%c%d%d\n",s1.number,,s1.sex,s1.age,s1.score);printf("%s%s%c%d%d\n",s2.number,,s2.sex,s2.age,s2.score);
}三.指向结构体类型数据的指针
C编译程序为结构体变量分配的存储区域的首地址就是结构体变量的指针。在C程序中,使用取地址运算符“&”就可以获得结构体变量的指针。定义结构体类型的指针变量,用于存放结构体变量的指针。
定义结构体类型指针变量的格式为:
struct结构体类型名*指针变量名;例如,定义了结构体类型student以后,下面的语句:structstudents1,s2,*p=&s1;就定义了student类型的二个结构体变量s1、s2和student类型的指针变量p,并使p指向结构体变量s1的存储地址。
如果结构体指针变量已经指向某个结构体变量,则可以通过该指针变量访问其指向的结构体变量的成员,使用格式:指针变量名->成员名例如:p->number等价于s1.number,p->age等价于s1.age,p->score等价于s1.score。【例8-4】使用结构体指针变量实现例8-3。
#include<stdio.h>
voidmain(){structstudent{charnumber[6];charname[20];charsex;intage; floatscore;}s1={"00001","Peter",'m',19,250.4},s2={"00002","Betty",'f',18,268.6},*p=&s1;printf("NumberNameSexAgeScore\n");printf("__________________________________\n");printf("%s%s%c%d%f\n",p->number,p->name,p->sex,p->age,p->score);p=&s2;printf("%s%s%c%d%f\n",p->number,p->name,p->sex,p->age,p->score);}四.结构体数组1.结构体数组的定义
在定义了结构体类型后,可以定义结构体数组。
定义结构体数组的格式:
struct结构体类型名数组名[元素个数];
例如:语句:
structstudents[10];定义了一个有10个元素的student类型的数组s[],数组的每个元素都是student类型的结构体变量。也可以在定义结构体类型数组的同时对数组元素初始化。在C程序中,通过数组元素名s[i](i=0、1、2、……9)引用相应的结构体成员。
【例8-5】参考例8-2中student类型的定义,从键盘输入学生信息,输出学生的姓名和成绩总分。#include<stdio.h>voidmain(){inti;structscore{intscore1;intscore2;intscore3;};structstudent{charname[10];charsex;intage;structscorestscore;}s[2];for(i=0;i<2;i++){printf("PleaseInputnameandscores\n");scanf("%s",s[i].name);scanf("%d",&s[i].stscore.score1);scanf("%d",&s[i].stscore.score2);scanf("%d",&s[i].stscore.score3);}for(i=0;i<2;i++)printf("%s:TotalScoreis%d\n",s[i].name,(s[i].stscore.score1+s[i].stscore.score2+s[i].stscore.score3));}2.结构体数组的指针
结构体数组的指针就是结构体数组存储区域的首地址。可以用结构体类型的指针变量指向该地址。例如,执行语句:structstudent{charnumber[6];charname[20];charsex;intage;intscore;}s[5],*p=s;
后,指针变量p指向结构体数组s[]的首地址。则:p指向s[0],p+1指向s[1],p+2指向s[2]……
【例8-6】用指针变量实现例8-5的功能。
#include<stdio.h>main(){inti;structscore{intscore1;intscore2;intscore3;};structstudent{charname[10];charsex;intage;structscorestscore;}s[2],*p=s;for(i=0;i<2;i++){printf("PleaseInputnameandscores\n");scanf("%s",(p+i)->name);scanf("%d",&((p+i)->stscore.score1));scanf("%d",&((p+i)->stscore.score2));scanf("%d",&((p+i)->stscore.score3));}for(p=s;p<s+2;p++)printf("%s:TotalScoreis%d\n",p->name,(p->stscore.score1+p->stscore.score2+p->stscore.score3));}此处的括号不可少
此处的括号不可少
五.结构体与函数结构体变量、结构体成员和结构体类型的指针变量都能够作为形参或实参参与函数调用。在函数调用过程中,遵循和基本数据类型变量相同的规则。【例8-7】通过函数调用实现例8-5的功能。#include<stdio.h>
structscore{intscore1;intscore2;intscore3;};structstudent{charname[10];charsex;intage;structscorestscore;};inttotal(structstudentstud);(转后)形参为student类型的结构体变量stud
main(){inti;structstudents[2];for(i=0;i<2;i++){printf("PleaseInputnameandscores\n");scanf("%s",s[i].name);scanf("%d",&s[i].stscore.score1);scanf("%d",&s[i].stscore.score2);scanf("%d",&s[i].stscore.score3);}for(i=0;i<2;i++)printf("%s:TotalScoreis%d\n",s[i].name,total(s[i]));}inttotal(structstudentstud){return(stud.stscore.score1+stud.stscore.score2+stud.stscore.score3);}(接前)实参为student类型的结构体变量s[i]
【例8-8】结构体数组指针参与函数调用的例子。本例程序实现从键盘输入学生学号,经搜索后输出该学生信息。#include<stdio.h>
#include<string.h>structstudent
{charnumber[6];
charname[20];charsex;intage;intscore;};
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 协作学习中教育技术工具的应用与影响
- 学习科学引领教育革新之路
- 混合式教学模式下的课程设计与实施策略分析
- 教育技术在医疗培训中的创新应用案例分析
- 新教育政策对特殊教育的支持与推动
- 抖音商户客服客诉升级处理时限制度
- 抖音商户直播样品视频制作流程制度
- 八大城市教育行业教育培训机构市场营销策略与品牌建设报告
- 公交优先战略视角下2025年城市交通拥堵治理效果评价体系构建报告
- BNS808-生命科学试剂-MCE
- 建筑工程项目参与证明(8篇)
- 疏通经络课件
- 2025-2030年中国3C数码充电器行业市场深度调研及市场供需与投资价值研究报告
- 2026届云南三校高考备考联考卷(一)化学试卷+答案
- 2024中国农业银行分行年度营销宣传方案
- 2025年高考全国一卷写作范文10篇
- 高三第一学期的班主任工作总结
- 汽车司机宿舍管理制度
- 物业监控调取管理制度
- 智能网联汽车技术课件:超声波雷达
- 人教版小学数学三年级上册第二单元《万以内的加法和减法(一)》教学课件+和复习
评论
0/150
提交评论