C语言程序设计:第9章 结构体与共用体

上传人:工**** 文档编号:570088350 上传时间:2024-08-01 格式:PPT 页数:25 大小:455KB
返回 下载 相关 举报
C语言程序设计:第9章 结构体与共用体_第1页
第1页 / 共25页
C语言程序设计:第9章 结构体与共用体_第2页
第2页 / 共25页
C语言程序设计:第9章 结构体与共用体_第3页
第3页 / 共25页
C语言程序设计:第9章 结构体与共用体_第4页
第4页 / 共25页
C语言程序设计:第9章 结构体与共用体_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言程序设计:第9章 结构体与共用体》由会员分享,可在线阅读,更多相关《C语言程序设计:第9章 结构体与共用体(25页珍藏版)》请在金锄头文库上搜索。

1、第第9 9章章 结构体与共用体结构体与共用体西安电子科技大学西安电子科技大学C C 语言程序设计语言程序设计1第第9章章 结构体与共用体结构体与共用体内容提要:内容提要: 9.1 结构体结构体 9.2 结构体型数组结构体型数组 9.3 结构体型指针结构体型指针 9.4 结构体与函数结构体与函数 9.5 共用体共用体2024/8/12l有时需要将不同类型的数据组合成一个有机的整体。有时需要将不同类型的数据组合成一个有机的整体。l如:一个学生的信息:如:一个学生的信息: 学号(学号(num)、姓名()、姓名(name)、性别()、性别(sex)、)、 年龄(年龄(age)、成绩()、成绩(scor

2、e)、家庭住址()、家庭住址(addr)等。)等。l如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?&结构体是一种构造数据类型结构体是一种构造数据类型结构体是一种构造数据类型结构体是一种构造数据类型&用途:把用途:把用途:把用途:把不同类型不同类型不同类型不同类型的数据组合成一个整体的数据组合成一个整体的数据组合成一个整体的数据组合成一个整体-自定义自定义自定义自定义数数数数据类型据类型据类型据类型9.1.1 9.1.1 结构体类型的定义结构体类型的定义结构体类型的定义结构体类型的定义9.1.1 结构体结构体struct 结构体类型名结构体类型名 类型标识符类型标识符 成员名;

3、成员名; 类型标识符类型标识符 成员名;成员名; .;成员类型可以是成员类型可以是基本型或构造型基本型或构造型struct是是关键字关键字, ,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体2024/8/139.1.1 结构体类型的定义结构体类型的定义例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; 结构体类型定义描述结构结构体类型定义描述结构的组织形式的组织形式,不分配内存不分配内存struct是关键字,表示是结构体类型是关键字,表示是结构体类型st

4、udent是结构体类型名是结构体类型名namenumsexagescoreaddr2字节字节2字节字节20字节字节1字节字节4字节字节30字节字节.2024/8/149.1.2 结构体变量的定义结构体变量的定义一、一、一、一、先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量l l一般形式:一般形式:一般形式:一般形式:l按按照照结结构构体体类类型型的的组组成成,系系统统为为定定义义的的结结构构体体变变量量分分配配内内存存单单元元。结结构构体体变变量量的的各各个个成成员员在在内内存存中中占占用用连连续续存存储

5、储区区域域,结结构构体体变量变量所占内存所占内存大小为大小为大小为大小为结构体中结构体中每个成员每个成员所占用内存的所占用内存的长度之和长度之和。l l用用用用sizeofsizeof运算符计算结构体变量所占内存空间。运算符计算结构体变量所占内存空间。运算符计算结构体变量所占内存空间。运算符计算结构体变量所占内存空间。struct 结构体类型名结构体类型名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体类型名结构体类型名 变量名表列变量名表列;例例 struct student int num; char name20; char se

6、x; int age; float score; char addr30; ; struct student stu1,stu2; l将将一一变变量量定定义义为为结结构构体体类类型型,不不仅仅要要求求指指定定变变量量为为结结构构体体类类型型,而而且且要要求指定为某一特定的结构体类型求指定为某一特定的结构体类型。2024/8/159.1.2 结构体变量的定义结构体变量的定义二、二、二、二、在定义结构体类型的同时定义结构体变量在定义结构体类型的同时定义结构体变量在定义结构体类型的同时定义结构体变量在定义结构体类型的同时定义结构体变量l l一般形式:一般形式:一般形式:一般形式:struct 结构体

7、类型名结构体类型名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列变量名表列;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 三、三、三、三、直接定义结构体变量直接定义结构体变量直接定义结构体变量直接定义结构体变量l l一般形式:一般形式:一般形式:一般形式:struct 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .变量名表列变量名表列;例例 struct int nu

8、m; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用用无名结构体无名结构体直接直接定义变量定义变量只能一次只能一次2024/8/169.1.2 结构体变量的定义结构体变量的定义说明:说明:说明:说明:1.1.结构体类型与结构体变量的区别结构体类型与结构体变量的区别结构体类型与结构体变量的区别结构体类型与结构体变量的区别l l定义时先定义结构体类型,然后定义结构体变量定义时先定义结构体类型,然后定义结构体变量定义时先定义结构体类型,然后定义结构体变量定义时先定义结构体类型,然后定义结构体变量l l定义类

9、型时不分配空间,定义变量时分配空间定义类型时不分配空间,定义变量时分配空间定义类型时不分配空间,定义变量时分配空间定义类型时不分配空间,定义变量时分配空间2.2.结构体的嵌套定义:结构体成员也可以是结构体变量。结构体的嵌套定义:结构体成员也可以是结构体变量。结构体的嵌套定义:结构体成员也可以是结构体变量。结构体的嵌套定义:结构体成员也可以是结构体变量。3.3.结构体成员名与程序中变量名可相同,不会混淆结构体成员名与程序中变量名可相同,不会混淆2024/8/179.1.3 结构体变量的引用结构体变量的引用l l引用形式:引用形式:引用形式:引用形式:结构体变量名结构体变量名. .成员名成员名l

10、l引用规则:引用规则:引用规则:引用规则:1.1.结构体变量结构体变量结构体变量结构体变量不能整体引用不能整体引用不能整体引用不能整体引用, ,只能引用变量只能引用变量只能引用变量只能引用变量成员;成员;成员;成员;但允许将一但允许将一但允许将一但允许将一个结构体变量直接赋值给另一个相同结构的结构体变量。个结构体变量直接赋值给另一个相同结构的结构体变量。个结构体变量直接赋值给另一个相同结构的结构体变量。个结构体变量直接赋值给另一个相同结构的结构体变量。2.2.如果是嵌套定义,用若干成员运算符,一级一级地找到最如果是嵌套定义,用若干成员运算符,一级一级地找到最如果是嵌套定义,用若干成员运算符,一

11、级一级地找到最如果是嵌套定义,用若干成员运算符,一级一级地找到最低的一级成员。低的一级成员。低的一级成员。低的一级成员。3.3.结构体成员变量可以象普通变量一样使用、运算。结构体成员变量可以象普通变量一样使用、运算。结构体成员变量可以象普通变量一样使用、运算。结构体成员变量可以象普通变量一样使用、运算。4.4.可以引用结构体变量的地址以及其成员的地址。可以引用结构体变量的地址以及其成员的地址。可以引用结构体变量的地址以及其成员的地址。可以引用结构体变量的地址以及其成员的地址。成员成员(分量分量)运算符运算符优先级优先级: 1结合性结合性:从左向右从左向右2024/8/189.1.3 结构体变量

12、的初始化结构体变量的初始化l l和其它变量一样,在定义结构体变量时赋初值和其它变量一样,在定义结构体变量时赋初值和其它变量一样,在定义结构体变量时赋初值和其它变量一样,在定义结构体变量时赋初值形式一:形式一: struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;形式二:形式二:struct student int num; char name20; char sex; int age;

13、char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三:形式三:struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 2024/8/199.1 结构体结构体例例例例9-1 9-1 结构体变量的定义与引用结构体变量的定义与引用结构体变量的定义与引用结构体变量的定义与引用#include struct student int num; char name20; char

14、sex; struct birthday int year; int month; int day;bir; float score; t1;void main(void)scanf(%d,&t1.num); scanf(%sn,t1.name); scanf(%c,&t1.sex); scanf(%d%d%d,&t1.bir.year, &t1.bir.month, &t1.bir.day); scanf(%f,&t1.score); printf(num is%dn,t1.num); printf (name is%sn,t1.name); printf(sex is%cn,t1.sex)

15、; printf (year is%d month is%d day is%dn,t1.bir.year, t1.bir.month, t1.bir.day); printf(score is%.1fn,t1.score);2024/8/1109.2 结构体型数组结构体型数组l l结构体型数组:数组中每个元素都是结构体类型的数据。结构体型数组:数组中每个元素都是结构体类型的数据。结构体型数组:数组中每个元素都是结构体类型的数据。结构体型数组:数组中每个元素都是结构体类型的数据。一、结构体型数组的定义一、结构体型数组的定义一、结构体型数组的定义一、结构体型数组的定义 与定义结构体变量相似,只需说

16、明其为数组即可。与定义结构体变量相似,只需说明其为数组即可。与定义结构体变量相似,只需说明其为数组即可。与定义结构体变量相似,只需说明其为数组即可。l l三种形式:三种形式:三种形式:三种形式:形式一: struct student int num; char name20; char sex; int age; ;struct student stu2;形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex; int age; st

17、u2;numnamesexagenumnamesexagestu0stu125Bl l结构体型数组在内存中连续存放。结构体型数组在内存中连续存放。结构体型数组在内存中连续存放。结构体型数组在内存中连续存放。2024/8/1119.2 结构体型数组结构体型数组二、结构体型数组的初始化二、结构体型数组的初始化二、结构体型数组的初始化二、结构体型数组的初始化l l形式:在定义的数组的后面加上形式:在定义的数组的后面加上形式:在定义的数组的后面加上形式:在定义的数组的后面加上=初值表列初值表列初值表列初值表列;例例 struct student int num; char name20; char s

18、ex; int age; stu =0406001,“lilin”,m,18, 0406002,“wanglin”,f,19, ;l l一个结构体数组元素相当于一个结构体变量,因此访问结一个结构体数组元素相当于一个结构体变量,因此访问结一个结构体数组元素相当于一个结构体变量,因此访问结一个结构体数组元素相当于一个结构体变量,因此访问结构体数组元素的成员与访问结构体变量的成员具有相同的构体数组元素的成员与访问结构体变量的成员具有相同的构体数组元素的成员与访问结构体变量的成员具有相同的构体数组元素的成员与访问结构体变量的成员具有相同的规则。规则。规则。规则。l l引用方式引用方式引用方式引用方式:

19、 : : :结构体数组名结构体数组名 下标下标 . .成员名成员名 struct student int num; char name20; char sex; int age; stu3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);2024/8/1129.2 结构体型数组结构体型数组9-2 9-2 候选人得票的统计程序。设有三个候选人,每次输入得票候选人的名候选人得票的统计程序。设有三个候选人,每次输入得票候选人的名候选人得票的统计程序。设有三个候选人,每次输入得票候选人的名候选人得票的统计程序。设有三个候选人,每次输入得票候选人的名字,要求最后输出每个候选人的

20、得票结果。字,要求最后输出每个候选人的得票结果。字,要求最后输出每个候选人的得票结果。字,要求最后输出每个候选人的得票结果。#include struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0; void main(void) int i,j,n; char leader_name20; printf(“enter n:”); scanf(“%d”,&n); for(i=1;i=n;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name

21、, leaderj.name)=0) leaderj.count+; for(i=0;inum (*p).num结构体指针名结构体指针名-成员名成员名结构体变量名结构体变量名.成员名成员名(*结构体指针名结构体指针名).成员名成员名2024/8/1159.3 结构体型指针结构体型指针 例例例例9-3 9-3 输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。#include void main(void) struct date /* 在函数中定义结构体类型在函数中定义结构体类型 */ int year; int month; int day; today,*p=&today;

22、/* 定义结构体变量及其指针定义结构体变量及其指针 */ printf (Enter today date(Y/M/D):); scanf(%d/%d/%d,&today.year,&today.month, &today.day); printf(Today:%d/%d/%dn,p-year,p-month, p-day); 2024/8/1169.3 结构体型指针结构体型指针 例例例例9-3 9-3 输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。#include void main(void) int i; struct date int year; int month;

23、 int day; today3,*p=today; printf (Enter today date(Y/M/D):); for(i=0;i3;i+) scanf(%d/%d/%d,&todayi.year,&todayi.month, &todayi.day); for(;pyear,p-month, p-day); 二、指向结构体型数组的指针二、指向结构体型数组的指针二、指向结构体型数组的指针二、指向结构体型数组的指针2024/8/1179.4 结构体与函数结构体与函数一、结构体作为函数参数一、结构体作为函数参数一、结构体作为函数参数一、结构体作为函数参数l l用结构体变量的成员作参数用

24、结构体变量的成员作参数用结构体变量的成员作参数用结构体变量的成员作参数-值传递值传递值传递值传递l l用结构体变量作参数用结构体变量作参数用结构体变量作参数用结构体变量作参数-多值传递多值传递多值传递多值传递,效率低,效率低,效率低,效率低l l用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数-地址传递地址传递地址传递地址传递#includestruct staff char name20; int salary; int cost; int realsum worker2= “wang_lin”,1000

25、,200,“li_ping”,1500,300;int getreal (struct staff);void main( ) struct staff *p; int real; for(p=worker;pname,real);int getreal(struct staff ss)return ss.salary-ss.cost;例例例例9-4 9-4 用子函数求工人的实发工资用子函数求工人的实发工资2024/8/1189.4 结构体与函数结构体与函数一、结构体作为函数参数一、结构体作为函数参数一、结构体作为函数参数一、结构体作为函数参数l l用指向结构体变量或数组的指针作参数用指向结构

26、体变量或数组的指针作参数用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数-地址传递地址传递地址传递地址传递#includestruct staff char name20; int salary; int cost; int realsum worker2= “wang_lin”,1000,200,“li_ping”,1500,300;void getreal (struct staff *);void main( ) struct staff *p; for(p=worker;pname,p-realsum);void getreal(struct staff *ss)s

27、s-realsum=ss-salary-ss-cost;例例例例9-4 9-4 用子函数求工人的实发工资用子函数求工人的实发工资2024/8/1199.4 结构体与函数结构体与函数二、结构体作为函数的返回值二、结构体作为函数的返回值二、结构体作为函数的返回值二、结构体作为函数的返回值#includestruct staff char name20; int salary; int cost; int realsum worker1,worker2= “wang_lin”,1000,200;struct staff getreal (struct staff );void main( ) wor

28、ker1=getreal(worker2); printf(%s should be payed %dn,worker1.name,worker1.realsum);struct staff getreal( struct staff ss )ss.realsum=ss.salary-ss.cost; return ss;例例例例9-4 9-4 用子函数求工人的实发工资用子函数求工人的实发工资2024/8/120l在需要节省内存空间时,在需要节省内存空间时,C语言还提供了一种由若干个不同语言还提供了一种由若干个不同 类型的数据项组成,但类型的数据项组成,但共享同一存储空间共享同一存储空间的构造

29、类型。的构造类型。&共用体是一种构造数据类型,共用体是一种构造数据类型,共用体是一种构造数据类型,共用体是一种构造数据类型,也叫联合体也叫联合体也叫联合体也叫联合体&用途:用途:用途:用途:使几个不同类型的变量使几个不同类型的变量使几个不同类型的变量使几个不同类型的变量共占一段内存共占一段内存共占一段内存共占一段内存( ( ( (相互覆盖相互覆盖相互覆盖相互覆盖) ) ) )9.5.1 共用体类型的定义共用体类型的定义9.5 共用体共用体union 共用体名共用体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;例例 union data int i; c

30、har ch; float f; ;fchi类型定义类型定义不分配内存不分配内存只是说明此类型数据只是说明此类型数据的组成情况的组成情况2024/8/1219.5.2共用体变量的定义共用体变量的定义9.5 共用体共用体形式二形式二: : union data int i; char ch; float f; a,b;形式一形式一: : union data int i; char ch; float f; ; union data a,b;形式三形式三: : union int i; char ch; float f; a,b,c;fchifchiab共用体变量定义分配内存,长度=最长成员所占

31、字节数共用体变量任何时刻只有一个成员存在2024/8/1229.5.3 共用体变量的引用共用体变量的引用l与结构体变量的引用方式相同与结构体变量的引用方式相同l引用规则引用规则& 不能引用共用体变量,只能不能引用共用体变量,只能引用其成员引用其成员& 共用体变量中起作用的成员是共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员& 不能不能在定义共用体变量时对其在定义共用体变量时对其初始化初始化&可以用一个共用体变量为另一个变量赋值可以用一个共用体变量为另一个变量赋值9.5 共用体共用体共用体指针名共用体指针名-成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体

32、指针名).成员名成员名例例 a.i=2; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 编译通过,编译通过, 运行结果不对运行结果不对) 例例 union int i; char ch; float f; a; a=1; ( ) 2024/8/1239.5.3 共用体变量的引用共用体变量的引用9.5 共用体共用体例例 union int i; char ch; float f; a=1,a,1.5; ( ) 例例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=a.f; ( )不能在定义共用体变量时对其初始化不能在定义共用体变量时对其初始化2024/8/1249.5.4 结构体与共用体的区别结构体与共用体的区别9.5 共用体共用体struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在变量的各成员同时存在任一时刻只有一个成员存在任一时刻只有一个成员存在2024/8/125

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号