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

下载本文档

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

文档简介

第11章结构体与联合体11.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;11.2结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名变量名表列;例#defineSTUDENTstructstudent

STUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

STUDENTstu1,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;numnamebirthdaymonthdayyear11.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)……..()形式二: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”};11.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例统计候选人选票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);}namecountLiZhangWang000structdata{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:30arga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数链表

C语言中,变量存储空间的分配分为静态分配和动态分配。静态存储分配:先在程序说明部分进行变量的说明,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。动态存储分配:在程序执行期间,通过“申请”分配指定的存储空间来存储数据,当有闲置不用的存储空间时,又可以随时将其释放。2.链表存储结构是一种动态数据结构特点:(1)它包含的数据对象的个数及其相互关系可以按需要改变.(2)存储空间是程序根据需要在程序运行过程中向系统申请获得.(3)不要求逻辑上相邻的元素在物理位置上也相邻.(4)没有顺序存储结构所具有的弱点.单向链表的逻辑状态QianSunLiZhouWuWangHead7131432537以上链表结构中只有一个方向的指针,因此又称为单链表,简称为链表。一般地,用户可根据链表存放的信息如存放学生信息就称为学生链表,存放职工信息就称为职工链表。在单链表,通常称它的数据元素为结点,每个结点都是一个结构体,至少包括两个成员:存储数据元素信息的成员称为数据域;存储直接后继结点存储位置的成员称为指针域.显然,链表结点的指针域存放的地址类型与它自身的类型是相同的。这就是C语言中较为特殊的递归结构体或自引用结构体,这种结构体是指向自身结构体的指针。数据元素之间的逻辑关系是由结点中的指针指示的,逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,即链表中的数据元素在内存中不是顺序存放的,要访问其数据元素不能像数组一样按下标去查找。要找一个元素,必须先找到上一个元素,根据上一个元素的指针域才能找到下一个元素。因此,链表的数据元素访问必须从头指针开始,逐个访问链表的每个结点,直到元素的指针域为空为止。要使用链表,首先应定义结点的类型,再定义相应的结构体变量。例如,前面链表中结点的结构类型可以定义为:

structstudent{charname[10];structstudent*next;};其中,next为指针变量,其类型为结构体类型student,它可存储一个student结构体类型变量的地址,即实现链表中指向下一个结点的指针域。这是一个递归定义,它在结构体student的定义未完成时又引用它定义其它的变量(指针变量)。引入链表后,用户就可以根据需要在程序的运行过程中动态分配存储空间。动态存储分配需要利用以下C语言库函数。(1)函数malloc函数功能:函数原型:void*malloc(unsignedintsize);在内存的动态存储区中分配一个长度为size的连续存储空间。其中,形参size为无符号整数,是函数malloc要求分配存储空间的字节个数。函数返回值为一个指针,它指向所分配存储空间的起始地址。若函数返回值为0,则表示未能成功申请到内存空间。函数类型为void,表示返回的指针不指向任何具体的类型.(2)函数calloc函数原型:voidcalloc(unsignedintn,unsignedintsize);函数功能:在内存的动态存储区域中分配n个长度为size的连续存储空间。函数的返回值为分配域的起始地址;如果分配不成功,则返回值为0。例如:int*p;p=(int*)calloc(3,8);分配3个8字节的的连续存储空间,并将其起始地址赋给整型指针p。(3)函数free函数原型:voidfree(void*ptr);函数功能:释放由指针变量ptr为所指示的内存区域。其中,ptr一个指针变量,指向最近一次调用函数malloc或calloc时所分配的连续存储空间的首地址。通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。例如:long*p;p=(long*)malloc(8);...free(p);Structstu*creat(){structstu*head;Structstu*last,*p;Intnum;Charname[20];Floatscore;Head=last=NULL;Printf(“pleaseinputnumnamescore:\n”);Scanf(“%d%s%f”,&num,name,&score);While(num>0){p=(structstu*)malloc(sizeof(structstu));pnum=num;strcpy(pname,name);pscore=score;pnext=NULL;if(head==NULL)head=p;elselastnext=p;last=p;scanf(“%d%s%f”,&num,name.&score);}Return(head);}Structstu{Intnum;Charname[20];Floatscore;Structstu*next;}headlastphead1wang85.0NULLlasthead1wang85.0last2liu63.5NULLp11.8联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)联合体类型定义定义形式:union联合体名{

类型标识符成员名;类型标识符成员名;…………….};例uniondata{inti;charch;floatf;};类型定义不分配内存2000200120022003chif形式一: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低字节高字节ch[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]);}枚举类型所谓枚举,是将具有相同属性的一类数据值一一列举。一.枚举类型的定义1.enum枚举类型名{标识符1,标识符2,…,标识符n};★enum是枚举类型定义的关键字★枚举类型名是用户命名的标识符,它与enum构成枚举类型的标识符★花括号中“标识符1,标识符2,…,标识符n”是所定义枚举类型的全部取值,通常称这些标识符为“枚举元素“或“枚举常量”。这些标识符是用户定义的标识符,一般是所代表事物的名称,但这些标识符并不自动地代表事物本身。例如enumcolor{red,blue,green,black};用户可根据需要在定义时直接指定某一枚举元素的编号,从而改变量系统默认的编号。例如:enumweek{sun=7,mon,tue=2,wed,thu,fri,sat};则sun的序号为7,mon的序号为8,tue的序号为2,wed的序号为3,thu的序号为4,fri的序号为5,sat的序号为6。2.枚举类型是有序类型一般地,枚举类型中各枚举元素按定义时的先后次序分别编号为0、1、2、...、n-1。例如:red<blue值为真,各枚举元素可根据其序号进行大小比较和相应的运算green-red值为2二.枚举类型的应用1.枚举类型变量的定义

enum{male,female}sex1,sex2;◆先定义枚举类型,再定义枚举类型变量enumweek{sun,mon,tue,wed,thu,fri,sat};enumweekweekday,workday;◆定义枚举类型的同时定义枚举变量enumcolor{red,blue,green,black}a,b,c;◆直接定义枚举变量

例:编写程序,输入今天是星期几,计算并输出明天是星期几Enumweek{sun,mon,tur,wed,thu,fri,sat}Enumweektomorrow(day)Enumday;{intn;n=((int)day+1)%7;Return((enumweek)n);}Main(){enumweekday1,day2;Char*name[]={“sum”,”mon”,”tur”,”wed”,”fri”,”sat”};Intn;Pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论