版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、结构体类型和结构体变量结构体数组结构体指针用指针处理链表共用体枚举类型用typedef定义类型,第11章结构体与共用体,问题一:学籍管理,问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用C语言程序存储并处理一组学生的学籍。,单个学生学籍的数据结构学号(num):int型姓名(name):char型性别(sex):char型年龄(age):int型分数(score):float型,单个学生学籍的数据结构如何定义?,多个学生学籍的数据结构如何定义?,这些信息数据之间相互关联,适合看作一个整体。但数据类型不一致,仅用已学数据类型无法解决。需要构造一种新的数据类型结构体。,11
2、.1-11.4结构体类型和结构体变量,结构体是用户根据自己的需要一种构造类型数据。结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,struct结构体名数据类型1成员名1;数据类型2成员名2;数据类型n成员名n;,中是组成该结构体的成员。成员类型可以是基本型或构造型,struct是关键字,不能省略,用户定义的合法标识符。可省:无名结构体,末尾分号不能省,结构体类型声明-构造自己所需的结构体类型,1、结构体类型声明,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,结构体名,成员名,例
3、声明结构体类型structstudent,注意:结构体类型声明只是定义了一种新的类型,类似int等类型。它是对结构的组织形式的描述,(类似于房屋户型图),系统还没分配实际内存空间。,结构的组织形式描述,只有定义结构体类型的变量,系统才分配内存空间,一般形式:struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名变量名表列;,(1)先定义(声明)结构体类型再定义变量名,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;/结构体类型的声明structstudentstudent1,st
4、udent2;/结构体变量的定义,2、结构体变量定义,有了类型后,就可以定义变量。三种形式:,(2)定义结构体类型的同时定义结构体变量一般形式:,struct结构体名类型标识符成员名;类型标识符成员名;.变量名表列;,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;student1,student2;,(3)直接定义结构体变量(即不出现结构体名)一般形式:,struct类型标识符成员名;类型标识符成员名;.变量名表列;,例structintnum;charname20;charsex;intage;flo
5、atscore;charaddr30;student1,student2;,用无名结构体直接定义变量只能一次,3、结构体变量需要的内存等于结构体变量所有成员占内存之和,22012430,student1,student1在内存中占59个字节,(2+20+1+2+4+30=59)。利用表达式sizeof(student1)或sizeof(structstudent)或可自动求得,注意:结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以,4、结构体变量初始化,就是为成员赋初值。根据前面结构体变量定义形式的三种情况,初始化的形式也有三种。,struc
6、t结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名结构体变量=初始数据;,例structstudentintnum;charname20;charsex;intage;charaddr30;structstudentstudent1=100102,“WangLin”,M,20,“Beijing”;,形式一:,Student1(初始化后),22012430,Student1(初始化前),此时,才真正货真价实。定义类型不分配空间。定义变量时分配空间,但值不确定,初始化后值确定。,形式二:,struct结构体名类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,例str
7、uctstudentintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;,5、结构体变量初始化,形式三:,例structintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;,struct类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,5、结构体变量初始化,6、结构体变量使用,(1)引用规则:一般情况下结构体变量不能整体引用,只能引用变量成员引用方式
8、:结构体变量名.成员名,.成员(分量)运算符优先级:1最高级结合性:从左向右,结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。成员名可以与程序中的变量名相同,二者不代表同一对象。,例:不能将一个结构体变量作为一个整体进行输入和输出。只能对各个成员变量分别输入输出。,structstudentintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;,printf(“%d,%s,%c,%d,%f,%sn”,stu1);(),printf(“%d,%s,%c,%d
9、,%f,%sn”,stu1.num,,stu1.sex,stu1.age,stu1.addr);(),scanf(%d,s,c,d,f,s,student1);(),scanf(%d,(),(2)例外:允许将一个结构体变量直接赋值给另一个具有相同结构的结构体变量,例如:structstudentcharnum15;charname20;intscore4;ints;student1=2007101010,wang,89,90,87,80,0;main()structstudentstudent2;student2=student1;.,例structdateintmonth;
10、intday;intyear;structstudentintnum;charname20;structdatebirthday;student1;,结构体成员本身又是一个结构体类型。例:声明structstudent类型时,将成员birthday指定为structdate类型,7、结构体类型的嵌套,结构体嵌套时逐级引用(只能对最低级的成员进行赋值或存取以及运算),student1.birthday.month=3()student1.birthday=3(),11.5、结构体数组,1、定义结构体数组:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。也有三种方法:,1、定义结构
11、体后定义structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;structstudentstu3;,2、定义结构体时同时定义structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu3;,一般初始化省略维数定义后初始化,一般初始化structstudentintnum;charname20;charsex;intage;floatscore;stu3=10101,李宁,M,18,87.5,10102,张凡,M,19,99,1010
12、3,王敏,F,20,78.5;,定义后初始化structstudentintnum;charname20;charsex;intage;floatscore;;structstudentstu3=10101,李宁,M,18,87.5,10102,张凡,M,19,99,10103,王敏,F,20,78.5;,每个数组元素的初始数据都用花括号括起来。,2、结构体数组的初始化结构数组n初值表1,初值表2,.,初值表n;,图11-4,图11-5,结构体数组元素类似于一个结构体变量只能对结构体数组元素的成员进行输入、输出或其它基本操作,例如:structs_typecharnum15;charname2
13、0;intscore4;ints;stu3=2007101010,wang,89,90,87,80,0,2007101011,Li,88,95,77,70,0,2007101012,Jiang,79,65,69,76,0;,main()inti;for(i=0;i3;i+)for(j=0;j4;j+)stui.s+=stui.scorej;.,3、结构体数组元素的使用,例11.2统计侯选人选票。有三个候选人,每次输入一个得票的候选人名,要求最后输出个人得票结果。,structpersoncharname20;intcount;leader3=“Li”,0,“Zhang”,0,”Wang“,0;
14、/全局结构体数组main()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,)=0)/看是谁得票leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,,leaderi.count);,运行结果::,程序定义一个全局的结构体数组leader,它有个元素,每一个元素包含两个成员name(姓名)和count(票数)。在定义数组时使之初始化,使3位候选人的票数都先置零。在主
15、函数中定义字符数组leader-name,它代表被选人的姓名,在10次循环中每次先输入一个被选人的具体人名,然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同。在输入和统计结束之后,将3人的名字和得票数输出。,11.6用指针访问结构体,1、指向结构体变量的指针可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。,成员运算符.指向运算符-优先级:1级,最高结合方向:从左向右(*)与-等价,定义形式:struct结构体名*结构体指针名;例:structstudent*p;使用形式:使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名-成员名
16、结构体变量名.成员名,示例11.3,main()structstudentlongintnum;charname20;charsex;floatscore;stu,*p;/定义结构体变量stu和结构体指针变量pp=,运行结果:No:89101name:LiLinsex:Mscore:89.500000,2指向结构体数组的指针,structstudentintnum;charname20;charsex;intage;stu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,WangMin,F,20;main()structstudent*p;for(p=s
17、tu;pnum,p-name,p-sex,p-age);,指针变量也可以用来指向结构体数组中的元素。,注意:p+指针移动1次,跨过一个structstudent结构体类型大小,程序分析:是指向structstudent结构体类型数据的指针变量。在for语句中先使的初值为stu,也就是数组stu第一个元素的起始地址。在第一次循环中输出stu0的各个成员值。然后执行,使自加。加意味着p所增加的值为结构体数组stu的一个元素所占的字节数。执行+后p的值等于stu1,指向stu1。在第二次循环中输出stu1的各成员值。在执行后,p的值等于stu+2,再输出stu2的各成员值。在执行+后,的值变为stu
18、+,已不再小于stu+3了,不再执行循环。,图11-8,请分析以下几种运算:-um得到指向的结构体变量中的成员um的值。-um得到指向的结构体变量中的成员um的值,用完该值后使它加。-um得到指向的结构体变量中的成员num的值加,然后再使用它。(+p)-num先使自加,然后得到它指向的元素中的num成员值(即10102)。(p+)-num先得到-num的值(即10101),然后使自加,指向stu1。,成员运算符.指向运算符-优先级:最高结合方向:从左向右(*)与-等价,总结:结构体成员变量引用方式,结构体变量.成员名(*p).成员名p-成员名其中,-称为指向运算符,3用结构体变量和指向结构体的
19、指针作函数参数,将一个结构体变量的值传递给另一个函数,有3个方法:用结构体变量的成员作参数。(2)用结构体变量作实参。(3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,值传递,值传递,不推荐使用,地址传递,例11.5结构体变量作为函数参数有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩。要求在main函数中赋予值,在另一函数print中将它们输出。今用结构体变量作函数参数。,#include#include#defineFORMAT“%dn%sn%fn%fn”structstudentintnum;charname20;floatscore3;,v
20、oidmain()voidprint(structstudent);structstudentstu;stu.num=12345;strcpy(,LiLin);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(stu);voidprint(structstudentstu)printf(FORMAT,stu.num,,stu.score0,stu.score1,stu.score2);,运行结果:12345LiLi67.50000089.00000078.599998,例11.6将上题改用指向结构体变量的指针
21、作实参。#includestructstudentintnum;charname20;floatscore3;stu=12345,LiLi,67.5,89,78.6;voidmain()voidprint(structstudent*);/*形参为指向结构体的指针变量*/print(/*实参改为stu的起始地址*/voidprint(structstudent*p)/*形参类型修改了*/printf(FORMAT,p-num,p-name,p-score0,p-score1,p-score2);/*用指针变量调用各成员的值*/,运行结果:12345LiLi67.50000089.0000007
22、8.599998,说明:例11.5值传递时(1)在发生函数调用时,形参结构体变量也要占用内存空间,接收实参结构体变量传递来的信息,因此函数之间传递结构体变量会带来时间和空间的巨大开销;(2)形参与实参之间是“值传递”的方式,被调函数对形参结构体变量的修改并不能传递给实参,即主调函数无法得到处理后的数据;(3)所以虽然语法上允许,但一般很少采用这种传递方式。而是采用例11.6传递结构体地址的方法,使得在调用函数与调用函数之间共享结构体变量数据。,链表是一种最常见的数据结构,它动态地进行存储分配。结构体数组:必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原
23、先定义的元素个数;当数据减少时,造成内存浪费。链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)链表有单向链表、双向链表、环形链表等形式。,11.7用指针处理链表,图11-10,链表是将若干个数据项按一定的原则连接起来的表。,链表组成:(1)头指针变量head存放首元素地址,指向链表的首结点。(2)每个结点由两个域组成:数据域存储结点本身的信息。(用户有用信息)指针域存放下一个结点的地址。(3)尾结点的指针域置为“NULL”,作为链表结束的标志。,连接原则:(1)前一个结点指向下一个结点;(2)只有通过前一个结点
24、才能找到下一个结点。,11.7.1链表概述,链表结点数据可以用结构体来描述,例如structstudentlongnum;floatscore;structstudent*next;/*指向下一结点*/;其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向structstudent类型数据(这就是next所在的结构体类型),voidmain()structstudenta,b,c,*head,*p;/对三个结点赋值a.num=89101;a.score=89.5;b.num=89103;b.score=90;c.num=89107;c.sc
25、ore=85;/建立彼此的链接,形成链表head=,静态链表:所有结点在程序中定义,没有动态申请空间,用完后也不能够释放空间,11.7.2简单链表,运行结果:8910189.58910390.08910785.0,11.7.2简单链表,程序分析:开始时使head指向a结点,a.next指向b结点,b.next指向c结点,这就构成链表关系。“c.next=NULL”的作用是使c.next不指向任何有用的存储单元。在输出链表时要借助p,先使p指向a结点,然后输出a结点中的数据,“p=p-next”是为输出下一个结点作准备。p-next的值是b结点的地址,因此执行“p=p-next”后p就指向b结点
26、,所以在下一次循环时输出的是b结点中的数据。,11.7.3处理动态链表所需的函数,malloc函数函数原型:void*malloc(unsignedintsize)功能:在内存的动态存储区分配size个字节的连续存储空间。返回值:成功,返回一个指针,该指针指向存储空间首地址,基类型为void;失败,返回空指针(NULL)。原因:内存空间不够。由于返回值是空类型指针,所以在调用时必须进行强制类型转换,将其转换成所需的类型。如:int*p=NULL;p=(int*)malloc(sizeof(int);,库函数和提供动态地开辟和释放存储单元的有关函数:,(2)calloc函数函数原型:void*c
27、alloc(unsignedn,unsignedsize)功能:在内存的动态存储区分配n个长度为size的连续空间。返回值:成功,返回所分配内存的首地址,基类型为void;失败,则返回空指针NULL。如:int*p=NULL;p=(int*)calloc(10,sizeof(int);用calloc函数可以为一维数组开辟动态存储空间,为数组元素个数,每个元素长度为Size。,(3)free函数函数原型:voidfree(void*p)功能:释放由p指向的空间。该地址p必须是最近一次由malloc、calloc、realloc函数申请成功返回的指针。free函数无返回值使用free前应检查该指针
28、是否为空。如:int*p=NULL;p=(int*)malloc(10*sizeof(int);if(p!=NULL)free(p);p=NULL;,注意:free和NULL配对使用!,(4)realloc函数void*realloc(void*ptr,size_tsize)功能:释放ptr指向的空间,并按size指定的大小重新分配空间,同时将原有数据拷贝到新分配的内存区域。返回值:成功,返回所分配内存的首地址;失败,则返回NULL。如:int*p=NULL;p=malloc(10*sizeof(int);p=realloc(p,40*sizeof(int);,对链表的基本操作,(1)创建(c
29、reate)链表:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)检索(scan)操作:按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。(3)插入(insert)操作:在结点ki-1与ki之间插入一个新的结点k,使线性表的长度增1。(4)删除(delete)操作:删除结点ki,使线性表的长度减1。,例11.8写一个函数creat(),建立一个有3个学生的单向动态链表。分析建立过程:设:链表结构为:structstudentlongnum;floatscore;structstudent*next;
30、约定:当输入的num等于零时,表示建立过程结束。定义以下变量:两个指针*p1,*p2structstudent*head;/*表头*/structstudent*p1;/*新建结点*/structstudent*p2;/*表尾结点*/,11.7.4建立动态链表,(1)创建(create)链表:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。,如何开辟第1个节点?开始时:head=NULL;(1)先用malloc函数开辟第1个节点,并使p1、p2指向它。(2)如果输入的p1-num,则输入的是一个有效的节点,而且是第1个结点数据(n=1),令headp1,
31、使head也指向新开辟的结点。(3)这样,p1所指向的新开辟的结点就成为链表中第1个结点,同时,p2=p1。,p2=p1=(structstudent*)malloc(LEN);scanf(%ld,%f,第1个结点headp1,如何开辟第2个节点:(1)再开辟一个新结点并使p1指向它,接着输入该结点的数据。,p1=(structstudent*)malloc(LEN);scanf(%ld,%f,(2)如果输入的p1-num,则应链入第个结点(n=2)。将p1指向的新结点的地址赋给第1个结点的next成员。,(3)接着使,也就是使也指向刚建立的新结点。p2重新指向表尾结点。,非第一个结点p2-n
32、ext=p1;,p2=p1;,如何开辟第2个节点(续):,如何开辟第3个节点:,(1)再新开辟一个结点并使p1指向它,接着输入该结点的数据。(2)如果输入的p1-num,则应链入第3个结点(n=3)。将p1指向的新结点的地址赋给第2个结点的next成员。p2-next=p1;(3)接着使p2=p1;也就是使也指向刚建立的新结点。p2重新指向表尾结点。,p2=p1;,非第一个结点p2-next=p1;,(1)再开辟一个新结点并使p1指向它,接着输入该结点的数据。(2)由于p1-num的值为,此新结点不应被连接到链表中.p2-next=NULL,建立链表过程至此结束,p1最后所指的结点未链入链表中
33、,第3个结点的next成员的值为NULL,它不指向任何结点。,如何封尾巴:,p2-next=NULL,NULL,建立链表的函数如下:#include#include#defineNULL0/令NULL代表,用它表示“空地址#defineLENsizeof(structstudent)/令LEN代表struct/student类型数据的长度structstudentlongnum;floatscore;structstudent*next;intn;/structstudent、n为全局变量,本文件模块中各函数均可使用它,structstudent*creat()/创建链表,返回表头指针stru
34、ctstudent*head;/表头structstudent*p1;/新建结点*/structstudent*p2;/表尾结点*/n=0;/结点数为0*/head=NULL;/还没有任何结点,表头为指向空*/p1=(structstudent*)malloc(LEN);/创建一个新结点p1p2=p1;/表尾p2也指向p1*/scanf(%ld,%f,/读入第一个结点的学生数据*/,while(p1-num!=0)/假设num=0表示输入结束n=n+1;if(n=1)head=p1;/第一个新建结点是表头elsep2-next=p1;/原表尾的下一个结点是新建结点p2=p1;/新建结点成为表尾
35、p1=(structstudent*)malloc(LEN);/新建一个结点scanf(“%ld,%f”,/返回表头指针,实际上书上程序还有不完美的情况:p1=(structstudent*)malloc(LEN);scanf(“%ld,%f”,改成:p1=(structstudent*)malloc(LEN);if(p=NULL)/或if(!p1)printf(内存分配出错);exit(1);scanf(“%ld,%f”,p1-next=NULL;,11.7.5输出链表只要已知表头结点head,设一个指针变量p,先指向第1个结点p=head,输出当前p所指的结点,通过p=p-next可以找到
36、下一个结点,从而可以输出链表的全部结点数据。voidprint(structstudent*head)structstudent*p;/指向要输入的结点printf(nNow,These%drecordsare:n,n);p=head;if(p=NULL)return;/不是空表doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;/指向下个结点while(p!=NULL);,11.7.6对链表的删除操作,从链表中删除一个结点,分两步:(1)找到要删除的节点(2)删除节点,把它从链表中分离出来,撤销原有的链接关系即可。,算法:设两个指针变量p1、p2,(1)
37、开始p1=head,用p1=p1-next一直找到需要删除的结点,设关键字num,num=p1-num代表找到。(2)让p1不断移动寻找要删除的结点过程中,p2也移动,始终指向p1的前一个结点。,应考虑以下情况:,1、删除的结点是第1个结点。,if(num=p1-num)/找到了if(p1=head)head=p1-next;/是第1个结点,要删的是第1个结点,则应将-赋给。指向原来的第2个结点。第1个结点虽然仍存在,但它已与链表脱离,因为链表中从头指针开始无法访问到它。,p-原来指向指向的结点(图中第2个结点),现在-改为指向-所指向的结点(图中第3个结点)。所指向的结点不再是链表的一部分。
38、,2、删除的结点不是第1个结点,if(num=p1-num)/找到了if(p1=head)head=p1-next;elsep2-next=p1-next;,还需要考虑链表是空表(无结点)和链表中找不到要删除的结点的情况。,删除结点的函数del:/参数是表头,和要删除的关键字。structstudent*del(structstudent*head,longnum)structstudent*p1,*p2;if(head=NULL)printf(“nlistnull!n”);gotoend;/空表p1=head;while(num!=p1-num,11.7.7对链表的插入操作,对链表的插入是指
39、将一个结点插入到一个已有的链表中。为了能做到正确插入,必须解决两个问题:怎样找到插入的位置;怎样实现插入。,head,先看下面一个简单的例子:如图所示的链表:它是按结点中的整数域从小到大排序的。现在要插入一个结点,该节点中的数为10。,待插入结点,此结点已插入链表,设在链表中,各结点按成员num(学号)由小到大顺序存放,把结点p0插入链表。用指针p0指向待插入结点,设把p0插在p1结点之前,插入算法:设三个指针变量p0、p1、p2,p0指向待插入结点,p0插在p2后,p1前。,p0,p1,p2,开始时只有p0和p1p0指向待插入结点p1=head1、p0-nump1-num,说明位置还应在后。
40、移动p1=p1-next直到p0-numnum2、p0现在该插在p1前。右链扣有了,左链扣?需要一个p2,标志p1的上1个位置。,1、如何找到应插入的位置,为什么需要三个指针变量p0、p1、p2?,p2=p1;p1=p1-next;,structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0-next=NULL;elsewhile(p0-nump1-num),实际上,插入的位置还有两个特殊情况,在表头和表尾。,2、如何插入:(1)一般情况插在中间:在p1之前、p2之后插入p0,(2)将p0插入第一个结点之前,当p0-num比
41、第一个结点num还小,或者就是一个空链表。,注意:此时不需用到p2。,(3)将p0插入表尾结点之后,当搜遍全表都没发现比p0-num小的情况,说明应插在表尾。,structstudent*insert(structstudent*head,structstudent*stud)structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)head=p0;p0-next=NULL;/空表,插第1个elsewhile(p0-nump1-num),main()structstudent*head,stu;longdel_num;printf(inputr
42、ecords:n);head=creat();print(head);printf(ninputthedeletednumber:);scanf(%ld,问题二:学校人员管理的问题,问题设计一个简单的学校人员管理程序。人员包括教师、学生。问题分析数据结构:人员的信息仍用结构体变量来保存。在每一个结构体变量中,所有的数据成员都要单独占用一个存储空间。但是,有些问题中,数据成员并不要同时出现、使用。,解决方法:共用体,11.8共用体有时需要将几个不同时出现的变量共享一个内存单元,如:将一个整型变量、实型变量、字符型变量共同放入同一个地址空间(当然这几个变量不能同时用),怎么办?C提供了构造类型共用
43、体(联合体)类型支持。,union联合名类型标识符成员名;类型标识符成员名;.;,例uniondatainti;charch;floatf;,类型定义不分配内存,一、定义共用体类型,形式一:uniondatainti;charch;floatf;a,b;,形式二:uniondatainti;charch;floatf;uniondataa,b,c,*p,d3;,形式三:unioninti;charch;floatf;a,b,c;,二、定义共用体变量,三、共用体变量特点:几个成员共用一段内存。引申1:共用体变量的内存长度是多少?最长成员所占字节数。引申2:共用体变量几个成员能同时存在吗?不能。一
44、个时刻只有一个成员存在。否则会被覆盖。引申3:共用体变量成员不能同时存在,那当前起作用的是谁?起作用的成员是最后一次存放的成员,结构体变量定义分配内存,长度=最长成员所占字节数,结构体变量任何时刻只有一个成员存在,四、共用体和结构体的比较:,例如:,结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。,structdatainti;charch;floatf;a;,uniondatainti;charch;floatf;a;,“结构体”变量:各成员同时存在占个字节。,“共用体”变量任一时刻只有一个成员存在占个字节(一个
45、实型占个字节),引用方式:,例a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对),引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例unioninti;charch;floatf;a;a=1;(),不能在定义共用体变量时初始化,例unioninti;charch;floatf;a=1,a,1.5;(),可以用一个共用体变量为另一个变量赋值,例floatx;unioninti;charch;floatf;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;(),五、共用体变量引用,
46、六、共用体变量和结构体可相互嵌套,七、共用体应用,structintnum;charname10;charsex;charjob;unionintclass;charposition10;category;person2;,例设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中。,前4项是相同的。最后1项根据成员job取不同值,共用体。,structintnum;charname10;charsex;charjob;unionintclass;charpositi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北十堰市张湾区人民医院招聘编外工作人员备考题库含答案详解(完整版)
- 2026年南平邵武市机关事业单位编外人员招聘31人备考题库附答案详解(达标题)
- 2026贵州贵阳产控安居投资运营有限公司第一批社会招聘8人备考题库含答案详解(黄金题型)
- 2025年健康管理师《健康管理知识》真题及答案解析
- 2025年基本公卫项目绩效考核试题及答案
- 路面施工应急预案
- 第1单元复习方案-三年级语文下册(统编版)
- 商业项目租赁定价原则与方案
- 绿色生产管理制度
- 冬季施工专项方案
- 2025年山东省委党校在职研究生招生考试(经济管理)历年参考题库含答案详解(5卷)
- 【一种轻型直升机的结构设计9000字(论文)】
- 2025至2030中国工业CT行业发展趋势分析与未来投资战略咨询研究报告
- 石油危机教学课件
- 特斯拉应聘简历模板
- 2025年全国花卉产销形势分析报告
- 2025年春季《中华民族共同体概论》第四次平时作业-国开(XJ)-参考资料
- 泵站改造工程设计方案指南
- 组装电脑合同协议
- 2025年不动产登记代理人《不动产登记代理实务》考前必刷题库(含真题、重点440题)含答案解析
- 三级动火安全技术措施方案
评论
0/150
提交评论