《第11结构体与共用体》由会员分享,可在线阅读,更多相关《第11结构体与共用体(38页珍藏版)》请在金锄头文库上搜索。
1、第十一章第十一章 结构体结构体与共用体与共用体 结构体的结构体的定义定义结构体的结构体的初始化初始化访问结构体成员访问结构体成员结构体和函数结构体和函数构造的数据类型构造的数据类型阅书嫡弧耪碾僧悍径受森喇息从庶负尺翁尊扮敷锣发赚议豺钠涕中撰伶菊第11结构体与共用体第11结构体与共用体7/29/2024111.1 概述概述结构体结构体:一种构造类型数据一种构造类型数据 (一条记录一条记录) 不同类型的数据组合成不同类型的数据组合成一个整体一个整体,以便引用以便引用为什么引入结构型数据为什么引入结构型数据?10010Li GangM1887.5Beijing num name sex age sc
2、ore addr结构体的定义结构体的定义:struct student short int num; char name20; char sex; short int age; float score; char addr30; ; struct student stu;结构体结构体类型类型咋口猾碳伟汗灾谜篷荷淀预驾槐残藕请冕篓峪挺稍笆独绷鲜阻船德惠杏购第11结构体与共用体第11结构体与共用体7/29/2024211.2 定义结构体类型变量的方法定义结构体类型变量的方法 结构体类型的形式:结构体类型的形式: struct 结构体名结构体名 类型名类型名1 成员名成员名1; 类型名类型名2 成员
3、名成员名2; :;这个结构就是一种这个结构就是一种数据类型数据类型结构体类型许多种结构体类型许多种关键字关键字三诗畴惩拙栓赌斌铭典太宏寺片戏创涯眨韦憾壕逻搐昼记雕啃判条铃裹随第11结构体与共用体第11结构体与共用体7/29/20243结构变量声明的三种方法:结构变量声明的三种方法:1、先定义结构,然后定义结构变量、先定义结构,然后定义结构变量(此法多用此法多用): struct student ; struct student studend1, student2;(变量表列)(变量表列)namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.在定义了结构体变量后
4、,系统会在定义了结构体变量后,系统会为之分配内存单元,为之分配内存单元,student1和和student2在内存中各占在内存中各占59个字节个字节例:分配给例:分配给student1的内存单元的内存单元肝弘隆此眺缕哨瘦漓夏彻锌讶简妊缀慑淋习季坚锻碑要闺绞督甥锁证朔也第11结构体与共用体第11结构体与共用体7/29/202442、定义结构体的同时定义结构变量:、定义结构体的同时定义结构变量: struct student studend1, student2;(变量表列(变量表列)3、直接定义结构体变量:、直接定义结构体变量: struct studend1, student2;注意注意 (1
5、)类型类型与与变量变量是不同的概念;是不同的概念; (2)对结构中的成员可以单独使用;)对结构中的成员可以单独使用; (3)成员可以是结构变量成员可以是结构变量;赋值赋值.存取存取.运算运算;在在编译时分配内存编译时分配内存靖厅快固个妈舒骤炳鼠永袜筑奈吁忌碰鉴弧桅炮授怔炊哦呈餐剩膜芭荤平第11结构体与共用体第11结构体与共用体7/29/20245成员可以是结构变量struct dateint month;int day;int year;struct studentint num;char name20;struct date birthday;char addr30 ;student1,st
6、udent2;numnamebirthdaymonthdayyearaddr牵圭溃陇冠交虱威雍者序睛菇凉琢侮甭蚌搪醒违杆的矫唬模絮缅时默瘸搀第11结构体与共用体第11结构体与共用体7/29/2024611.3 结构体变量的引用结构体变量的引用 结构体变量不能整体引用,只能引用其成员结构体变量不能整体引用,只能引用其成员 1) 结构体变量中成员的引用方式结构体变量中成员的引用方式 结构体变量名结构体变量名.成员名成员名 student1.num (“.”是成员运算符是成员运算符,优先级最高)优先级最高)2)如果成员本身又属一个结构体类型)如果成员本身又属一个结构体类型,则要找到最则要找到最 低一
7、级的成员低一级的成员,对它进行赋值或存取以及运算对它进行赋值或存取以及运算. student1.birthday.month student1.birthday3)成员可以像普通变量一样进行各种运算)成员可以像普通变量一样进行各种运算. student2.score= student1.score; student1.age+;例如:例如:student1.num = 10010;阿降暮您绒浑受钦辜畴烬所粘凋兔孰烩执驶逸苛氧提国逗萄怠并寂焕缔腹第11结构体与共用体第11结构体与共用体7/29/2024711.4 结构体变量的初始化 在定义时初始化在定义时初始化(eg11.1)struct st
8、udent int num;char name20;char sex;char addr20;a=89031,Li Lin,M,123 Beijing Road;仅在定义时可整体初始化仅在定义时可整体初始化 a.num=89031; a.sex=M; a; name如何赋初值如何赋初值?棕摘佐荷惫桂威躲蚁女采歇族炕笼潦役灭砒伎戒麓匠绞搓虞谆哉蓄创掐哎第11结构体与共用体第11结构体与共用体7/29/2024811.5 结构体数组 1 )定义结构体数组定义结构体数组 将结构体定义中的变量定义为数组即可将结构体定义中的变量定义为数组即可 struct student int num; char n
9、ame20; char sex; int age; float score; char addr30; ; struct student stu3;跋柠誓愈了例奠垢直掏虱屎声雍仔腻地哟痘婚胯翅权友顶葵真闰逊间密瞩第11结构体与共用体第11结构体与共用体7/29/202492 )结构体数组的初始化结构体数组的初始化 struct student stu3=10101,LiLin,M,18,87.5,123 Beijing,10102,“zhangfun,M,19,99,123 Shanghai,10104,“Wang Min,F,20,78.5,123 Nanjing;struct studen
10、t int num; char name20; char sex; int age; float score; char addr30; ; 锗延裕侧御臭昌手才代队锨注绝种荤胁网沽黔肘病摄旭歧湿摹颓由启森汤第11结构体与共用体第11结构体与共用体7/29/20241010101“li lin”1887.5“123 Beijing”10102“zhang fun”stu0stu159BMM1999“123 shanghai”3)结构体数组的应用举例)结构体数组的应用举例例例 11.2 对候选人得票的统计程对候选人得票的统计程序。有序。有3个候选人,每次输入一个个候选人,每次输入一个得票的候选人的
11、名字,要求最后输得票的候选人的名字,要求最后输出各人的得票结果。出各人的得票结果。嘘脂每儿反新仲伍六份踌轮贴便些瘟糖吭沟贞鳃陵谜谴擦乌新症狡勒惶但第11结构体与共用体第11结构体与共用体7/29/202411#include#includestruct personchar name20;int count;leader3=Li,0,Zhang,0,Fun,0;void main()int i,j;char leader_name20;for(i=1;i=5;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj
12、.name)=0)leaderj.count+;printf(n);for(i=0;inum=10010;(1)结构体变量结构体变量.成员名成员名(2)(*p).成员名成员名(3) p- .成员名成员名闪丑规姐淆咨瞄位秆敬猿轨量膘香蔑租窘腮蕊历加凹宅屎谁涡了椿流逃渊第11结构体与共用体第11结构体与共用体7/29/202413#includevoid main()struct student long int num;char name20;char sex;float score;struct student stu_1; struct student *p; p=&stu_1;stu_1.
13、num=89031;strcpy(stu_1.name,Li Lin);stu_1.sex=M; stu_1.score=89.5;printf(NO.:%ldnname:%snsex:%cnscore:%fn,stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf(NO.:%ldnname:%snsex:%cnscore:%fn,(*p).num,(*p).name,(*p).sex,(*p).score);eg11.3丽赞树酱拂载错皖疥殉独幂鄂响蔚占盛秧砌妥挚俏绿被黑迪抡抱梁瞄狄咙第11结构体与共用体第11结构体与共用体7/29/2024142
14、)指向结构体数组的指针例 11.4#include struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;void main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age);10101Li lin M18stu0pstu1stu2p+1镣芍傅诺捌杯距朝绢商集琶聊革信茂欣舰寓嘴姓热硷蔬几诽朽匣蘸叼奏磊第11结构体与共用体第11结构体与共用体7/29
15、/2024153)用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数把结构传递给函数有三种方式:把结构传递给函数有三种方式: 单个成员单个成员 整个结构整个结构 指向结构的指针指向结构的指针1、成员传递成员传递:用结构变量成员作为实参:用结构变量成员作为实参(值传递)值传递) 例如:对于上面定义的结构变量例如:对于上面定义的结构变量stu_1有四个成员。有四个成员。其中任何一个都可以做实参。其中任何一个都可以做实参。 void main() prin(stu_1.num); : 抑咕达灰氯雨述镇咋助彦织壹乖厌灾拙日丹禾妄婆走茶罐对躬爆签另清碎第11结构体与共用体第
16、11结构体与共用体7/29/2024162、结构传递(全体传递,多值传递)结构传递(全体传递,多值传递): 用结构变量作实参用结构变量作实参 将结构变量所占的内存单元内容全部顺序传递给形参(将结构变量所占的内存单元内容全部顺序传递给形参(值值传递传递),由于采用值传递内存开销大、在被调函数中改变),由于采用值传递内存开销大、在被调函数中改变的形参值不能返回主调用函数,因此在使用上很不方便。的形参值不能返回主调用函数,因此在使用上很不方便。 eg11.5.c3、传引用调用(地址传递传引用调用(地址传递):): 定义结构指针变量并以此指针作为实参定义结构指针变量并以此指针作为实参 从而完成将结构变
17、量的指针传给函数。主调函数和被调函从而完成将结构变量的指针传给函数。主调函数和被调函 数共用一段内存空间。数共用一段内存空间。 eg11.6.c用指针作函数参数能提高程序运行效率,有时节约内存。用指针作函数参数能提高程序运行效率,有时节约内存。目侠寄迢闲蛤蹲栋刮汲哪紧晃芝撬尧茧舆藻买展湾影症蘸谦老涵遵鳖类剂第11结构体与共用体第11结构体与共用体7/29/20241711.8 共用体&构造数据类型构造数据类型,也叫联合体也叫联合体&用途:使几个不同类型的变量共占一段内存用途:使几个不同类型的变量共占一段内存(相互覆盖相互覆盖)共用体类型定义定义形式:union 共用体名共用体名 类型标识符类型
18、标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;例 union data short int i; char ch; float f; ;fchi类型定义不分配内存泽激溅沽鸯疏奴辟陶恼罚疆纽齿赢药叠乃内礁榜取埃惋挂瓷否留疟煤渍骡第11结构体与共用体第11结构体与共用体7/29/202418形式一: union data short int i; char ch; float f; a,b;形式二: union data short int i; char ch; float f; ; union data a,b,c,*p,d3;形式三: union short int
19、i; char ch; float f; a,b,c;共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在照仍蓉倡构评坷葱挤缆鄙约期粤处喝盔蔡莱杠垄辐吉貌昌宙丢恃世座叔装第11结构体与共用体第11结构体与共用体7/29/202419共用体变量引用引用方式:例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果不对) 引用规则不能引用共用体变量,只能引用其成员共用体指针名共用体指针名-成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名
20、union data int i; char ch; float f; ; union data a,b,c,*p,d3; p=&a;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.f共用体变量中起作用的成员是最后一次存放的成员例 union int i; char ch; float f; a; a=1; () 不能在定义共用体变量时初始化例 union int i; char ch; float f; a=1,a,1.5; () 可以用一个共用体变量为另一个变量赋值例 float x; union int i; char
21、 ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()赚胀贿超瓣寓裹资村画骋辜河楔付咒雹瞻叮云羽膛忿秽叫御榴程虞告尧噪第11结构体与共用体第11结构体与共用体7/29/202420结构体与共用体区别: 存储方式不同struct node char ch2; short int k;a;union node char ch2; short int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在联系: 两者可相互嵌套胁壮表缉絮垢旭蹿含豌舰槐胀谎斜膨征啤狮梢冯从阮盛刨面徊蚂禹鹤烹惠第11结构体与共用体第11结构
22、体与共用体7/29/202421例 结构体中嵌套共用体eg11.12 name numsexjobclasspositionLiWang101102FMst501prof循环n次读入姓名、号码、性别、职务job=s真真假假读入class读入position输出“输入错”循环n次job=s真假输出:姓名,号码,性别,职业,班级输出:姓名,号码,性别,职业,职务job=tstruct int num; char name10; char sex; char job; union int class; char position10; category;person2;灸剪华毡么脑予偏泻壮遂晴麻答笑
23、啄耐抖拈蜕示骇琐迎汞喂效终险姥转救第11结构体与共用体第11结构体与共用体7/29/20242211.9 枚举类型如果一个变量只有几种可能的值,可定义为枚举类型。一、枚举类型定义定义的一般形式为:enum 枚举名 枚举值表 ; 在枚举值表中应罗列出所有可用值,这些值也称为枚举元素,被说明为该“枚举”类型的变量取值不能超过定义的范围例如:enum weekday sun,mon,tue,wed,thu,fri,sat ; 泛炒抡弱锄诉逢闹孺脓华伺淘睁吻候挡成窿殉府藏终赃瞪逝极憨沏闽肉掂第11结构体与共用体第11结构体与共用体7/29/202423枚举变量的定义同结构体相同,有三种形式enum w
24、eekday sun,mou,tue,wed,thu,fri,sat ;enum weekday a,b,c;或者:enum weekday sun,mou,tue,wed,thu,fri,sat a,b,c;或者:enum sun,mou,tue,wed,thu,fri,sat a,b,c;祟毗拴第岳耶鲍怜苫峡腕牛铡忆明切啄原摈驻沪命宫蔡毫豪灶侦谎侧谷逮第11结构体与共用体第11结构体与共用体7/29/202424二、赋值和使用1.枚举值(枚举元素)是常量,不能在程序中用赋值语句再对它赋值例如:sun=5; 错误mon=2; 错误蚊弟妇典兼扁乐享张炉筛潜陋已医序瘴阁稚胡刚北戏裤透宛助狙吸丢纶
25、隐第11结构体与共用体第11结构体与共用体7/29/2024252.枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2例如:sun的值是0,mon的值是1瞻枉决研敌诈盖慷坍馅躯轧点逮函觅摔观猛卷赖趟肮悸蛆烤逊傈鸿陷叙过第11结构体与共用体第11结构体与共用体7/29/2024263.枚举值可以用来作判断比较按其在定义时的顺序号比较例如:enum weekday sun,mon,tue,wed,thu,fri,sat a;sunmonif( anum=202; ps-name=Zhang San; ps-sex=M; ps-score=86.5; printf(Number=%dnName=%sn,ps-num,ps-name); printf(Sex=%cnScore=%fn,ps-sex,ps-score); free(ps);整个程序包含了申请内存空间、使用内存空间、释放内存整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。空间三个步骤,实现存储空间的动态分配。棒屠评飘筒酸绳记痕半雏椎练苯酉管虎坛她疡蓬踩万税碧救坦苔匝岳脊构第11结构体与共用体第11结构体与共用体7/29/202438