




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10.1—10.2结构体及结构体变量的定义第10章结构体与共用体思政目标1、培养学生通过结构体组织数据的能力,使其明白个体在整体中的作用,增强团队协作意识,助力社会和谐发展。2、让学生在学习结构体类型定义中,领悟规则的重要性,养成严谨规范的习惯,提升科学精神与职业素养。10.1—10.2结构体及结构体变量的定义第十章结构体与共用体10.1
结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型结构体类型定义struct[结构体名]{
类型标识符成员名;类型标识符成员名;
…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体例
struct
student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存结构体类型定义的作用域例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
structstudentstu1,stu2;10.2
结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名变量名表列;例#defineSTUDENTstructstudent
STUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;定义结构体类型的同时定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;直接定义结构体变量一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];
structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear10.3-10.7结构体变量的引用第10章结构体与共用体思政目标1、理解结构体变量引用规则,培养学生遵循规范、严谨细致的做事态度,提升逻辑思维能力。2、掌握结构体数组与指针,引导学生体会数据组织的系统性,增强解决复杂问题的信心与能力。10.3-10.7结构体变量的引用10.3
结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);(
)stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};(
)例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..(
)10.4
结构体变量的初始化形式一:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式二:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:struct{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};10.5
结构体数组结构体数组的定义三种形式:形式一:
structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B结构体数组初始化例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};例structstudent{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时维数可省结构体数组引用引用方式:结构体数组名[下标].成员名structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);例统计后选人选票structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang00010.6
结构体和指针指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例指向结构体的指针变量main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");
p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);}例intn;int*p=&n;
*p=10;
n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101指向结构体数组的指针例指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+1用指向结构体的指针作函数参数用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低structdata{inta,b,c;};main(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)例用结构体指针变量作函数参数arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****10.8-10.9共用体第10章结构体与共用体思政目标1、理解共用体特性,培养学生在资源有限时权衡利弊、合理选择的能力,树立正确的资源观,增强创新意识与探索精神。2、学会用typedef定义类型,使学生明白名称变化不改变本质,培养学生辩证看待问题的思维,提升抽象概括与知识迁移能力。10.8-10.9共用体10.8
共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:union共用体名{
类型标识符成员名;类型标识符成员名;
…………….};例uniondata{inti;charch;floatf;};fchi类型定义不分配内存形式一:uniondata{inti;charch;floatf;}a,b;形式二:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在共用体变量引用引用方式:例a.i=1;a.ch=‘a’;a.f=1.5;printf(“%d”,a.i);(
编译通过,运行结果不对)
引用规则不能引用共用体变量,只能引用其成员共用体指针名->成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;(
)
不能在定义共用体变量时初始化例union{inti;charch;floatf;}a={1,’a’,1.5};(
)
可以用一个共用体变量为另一个变量赋值例floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a’;a.f=1.5;b=a;(
)x=a.f;(
)例将一个整数按字节输出0110000101000001低字节高字节0100000101100001ch[0]ch[1]运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}结构体与共用体区别:存储方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在联系:两者可相互嵌套例结构体中嵌套共用体namenumsexjobclasspositionLiWang10112086FMST501prof循环n次读入姓名、号码、性别、职务job==‘s’真真假假读入class读入position输出“输入错”循环n次job==‘s’真假输出:姓名,号码,性别,职业,班级输出:姓名,号码,性别,职业,职务job==‘t’struct{intnum;charname[10];charsex;charjob;
union{intclass;charposition[10];}category;}person[2];例共用体中嵌套结构体,机器字数据与字节数据的处理0001001000110100低字节高字节0011010000010010lowhigh0x12340001001011111111低字节高字节1111111100010010lowhigh0x12ffstructw_tag{charlow;charhigh;};unionu_tag{structw_tagbyte_acc;intword_acc;}u_acc;word_accbyte_acc.lowbyte_acc.highu_acc10.9
用typedef定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:typedeftype
name;例typedefintINTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例typedeffloatREAL;类型定义后,与已有类型一样使用例INTEGERa,b,c;REALf1,f2;
inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与define不同
define
typedef预编译时处理
编译时处理简单字符置换
为已有类型命名
typedef定义类型步骤按定义变量方法先写出定义体如inti;将变量名换成新类型名如intINTEGER;最前面加typedef如typedefintINTEGER;用新类型名定义变量如INTEGERi,j;例定义数组类型
inta[100];intARRAY[100];typedefintARRAY[100];ARRAYa,b,c;
inta[100],b[100],c[100];例定义指针类型
char*str;char*STRING;typedefchar*STRING;STRINGp,s[10];char*p;
char*s[10];例定义函数指针类型
int(*p)();int(*POWER)();typedefint(*POWER)();POWERp1,p2;int(*p1)(),(*p2)();例定义结构体类型
structdate{intmonth;intday;intyear;}d;例定义结构体类型
structdate{intmonth;intday;intyear;}DATE;例定义结构体类型typedefstructdate{intmonth;intday;intyear;}DATE;例定义结构体类型
DATEbirthday,*p;structdate{intmonth;intday;intyear;}birthday,*p;类型定义可嵌套例typedefstructclub{charname[20];intsize;intyear;}GROUP;typedefGROUP*PG;PGpclub;GROUP*pclub;structclub*pclub;GROUP为结构体类型PG为指向GROUP的指针类型10.10常见错误分析第10章结构体与共用体思政目标1、剖析结构体常见错误,培养学生严谨细致的编程习惯,引导学生对待问题追根溯源,提升解决问题的能力。2、理解结构体与其他类型差异,让学生明白知识的准确性和严谨性,树立正确的学习态度,增强学习的责任感。10.10常见错误分析10.10常见错误分析结构体类型声明是一条完整的语句,因此,大括号后面的分号不能少。初学者很容易忘记这一点。例如:#include<stdio.h>structnode{ intnum; intscore1; intscore2;} /*结构体类型声明时漏掉了花括号后面的分号*/structnoden;intmain(){ n.num=1; printf("%d",n.num); return0;}1程序在编译时,编译系统会提示语句中不应该有structnode,如图所示。编译系统认为编程者想直接定义一个结构体变量n,上述代码只要在structnode结构体数据类型声明的最后加上分号即可。10.10常见错误分析要注意区别结构体数据类型和结构体变量,不能对结构体类型进行赋值。例如:structstudent{ intsID=100; /*学号*/ charsSex='F'; /*性别*/ intsMath=90; /*高数成绩*/ intsEng=80; /*英语成绩*/ intsC=89; /*C语言程序设计成绩*/};structstudent是用户自定义的结构体数据类型,其用法相当于基本数据类型int,structstudent仅是数据类型的名字,不是变量,不占存储单元。在C语言程序中,只能对结构体变量中的成员赋值,而不能对结构体数据类型中的成员赋值。210.10常见错误分析上述代码可改为:structstudent{ intsID; /*学号*/ charsSex; /*性别*/ intsMath; /*高数成绩*/ intsEng; /*英语成绩*/ intsC; /*C语言程序设计成绩*/};structstudentsx; /*定义structstudent型变量sx*/sx.sID=100; /*为sx变量的成员赋值*/sx.sSex='F';sx.sMath=90;sx.sEng=80;sx.sC=89;10.10常见错误分析定义结构体类型变量时需要使用struct关键字,许多初学者容易遗漏这个关键字。例如:#include<stdio.h>structstudent{ char*name; intscore;};intmain(){ students1; /*漏掉struct关键字*/ return0;}310.10常见错误分析编译错误信息如图所示,提示定义结构体变量语句出错,只须将该语句改成“structstudents1;”即可。10.10常见错误分析本章小结本章主要介绍了几种构造数据类型,包括结构体、共用体和枚举类型。通过本章的学习,读者应重点掌握以下内容。掌握结构体类型声明、结构体变量定义、结构体变量初始化和引用的方法。掌握结构体数组和结构体指针的应用。了解链表的相关操作。了解共用体类型声明、共用体变量定义、共用体变量初始化和引用的方法。了解枚举类型的概念。掌握用typedef声明新类型名的方法。结构体的应用为处理复杂的数据结构提供了有利的手段,因此,读者应学习好本章内容,从而为学习后续课程《数据结构》打好基础。10.11经典题解第10章结构体与共用体思政目标1、通过经典题解巩固知识,培养学生深入思考、独立解决问题的能力,提升逻辑思维,增强面对挑战的信心。2、分析题目引导学生严谨对待知识细节,培养学生耐心细致、认真负责的学习态度,树立正确的学术价值观。1.若有以下结构体定义:
structexample
{intx;inty;}v1;则(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人借款协议财产抵押
- 城市亮化与景观设计方案
- 智能语音设备销售及服务合同
- 影视制作服务中版权纠纷与免责条款的协议
- 惠州学院教师进修协议书
- 意向租赁合同年
- 网络科技业物联网技术应用与发展规划方案设计
- 丧葬礼仪服务契约合同书
- 农业技术创新与研发方案
- 生物制药研发项目投资合同
- 六年级下健康教案设计
- 人美版新课标小学三年级美术(下册)
- 医院院外会诊申请单、医师外出会诊审核表、医师外出会诊回执
- 《互联网金融》教案
- 核酸的分离与纯化技术
- 中国传统节日课件:拗九节
- 体验店FM述职报告
- 教科版六年级下册科学第三单元《宇宙》教材分析及全部教案(定稿;共7课时)
- 学校教育中的品牌塑造与校园文化建设培训课件
- 济南广播电视台面向社会招聘工作人员笔试参考题库(共500题)答案详解版
- 【公司会计信息化建设研究文献综述2000字】
评论
0/150
提交评论