结构体课件讲解_第1页
结构体课件讲解_第2页
结构体课件讲解_第3页
结构体课件讲解_第4页
结构体课件讲解_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论