结构体与共用体优秀课件.ppt
《结构体与共用体优秀课件.ppt》由会员分享,可在线阅读,更多相关《结构体与共用体优秀课件.ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、结构体与共用体第1页,本讲稿共68页 教学要求:教学要求:1.1.掌握结构体类型和结构体变量的定义方掌握结构体类型和结构体变量的定义方法。法。2.2.掌握结构体变量的使用,掌握结构体数组的掌握结构体变量的使用,掌握结构体数组的应用。应用。3.3.初步掌握单链表的基本操作。初步掌握单链表的基本操作。4.4.掌握共用体变量的定义方法及其引用。掌握共用体变量的定义方法及其引用。第第1 12 2章章 结构体与共用体结构体与共用体第2页,本讲稿共68页 一辆银灰色的车牌号为湘一辆银灰色的车牌号为湘A00001A00001的雪弗兰轿车以的雪弗兰轿车以80km/h80km/h的速度行驶。的速度行驶。在这里由
2、车牌、车名、型号、车速共同构成了对在这里由车牌、车名、型号、车速共同构成了对一辆轿车的描述,一辆轿车的描述,在数据处理中,这四个属性应该当在数据处理中,这四个属性应该当作一个整体来处理。但它们不属于同一类型,无法用作一个整体来处理。但它们不属于同一类型,无法用数组来容纳,而用单个变量来分别代表各个属性,又数组来容纳,而用单个变量来分别代表各个属性,又难以反映出它们的内在联系。难以反映出它们的内在联系。C语言提供结构体语言提供结构体(structure)数据结构数据结构,将不同数将不同数据类型、但相互关联的一组数据,组合成一个有机整据类型、但相互关联的一组数据,组合成一个有机整体使用。体使用。1
3、2.1 12.1 概概 述述第3页,本讲稿共68页 1.结构类型定义结构类型定义 定义形式:定义形式:strcut 结构类型名结构类型名 数据类型数据类型成员;成员;数据类型数据类型成员;成员;数据类型数据类型成员成员n;;/*些行的分号不能少些行的分号不能少*/也可以表述成如下形式:也可以表述成如下形式:struct 结构体名结构体名 分量表分量表 ;12.2 12.2 结构类型与结构变量的定义结构类型与结构变量的定义(1)struct是结构是结构类型关键字类型关键字(2)“结构体名结构体名”和和“数据项名数据项名”的的命名规则,与变量命名规则,与变量名相同。名相同。(3)个数据项称个数据项
4、称为结构类型的个为结构类型的个成员(或分量)。成员(或分量)。第4页,本讲稿共68页 2.结构体类型特点结构体类型特点 ()定定义义一一个个结结构构体体类类型型,系系统统不不会会为为其其分分配配内内存存单单元元。定定义义一一个个类类型型只只是是表表示示这这个个类类型型的的结结构构,即即告告诉诉系系统统它它由由哪哪些些类类型型的的成成员员构构成成,各各占占多多少少个个字字节节,各各按按什什么形式存储,并把它们当作一个整体来处理。么形式存储,并把它们当作一个整体来处理。()结结构构体体类类型型由由多多个个成成员员组组成成,成成员员的的数数据据类类型型可可以以是是整整型型、实实型型、字字符符型型、数
5、数组组 ,也也允允许许是是另另一一个个已已经经定义的结构体类型。定义的结构体类型。()结构体类型是根据设计者的需要来组合的。结构体类型是根据设计者的需要来组合的。()结构体类型系统没有预先定义,凡需要使用结构结构体类型系统没有预先定义,凡需要使用结构体类型数据的,都必须在程序中自己定义。体类型数据的,都必须在程序中自己定义。第5页,本讲稿共68页struct student int num;char name20;char sex;int age;float score;char addr30;例如:定义学生档案信息例如:定义学生档案信息结构类型结构类型:成员表列成员表列 struct是类型关
6、是类型关键字键字后分号不能少,后分号不能少,表明语句结束。表明语句结束。结构体名结构体名第6页,本讲稿共68页 又例如,定义一个日期结构类型:又例如,定义一个日期结构类型:struct date int year;int month;int day;数数据据类类型型相相同同的的数数据据项项,既既可可逐逐个个、逐逐行行分分别别定定义义,也可合并成一行定义。写为如下形式:也可合并成一行定义。写为如下形式:struct date int year,month,day;3.结构体成员的类型可以是结构体类型结构体成员的类型可以是结构体类型 在在定定义义一一个个结结构构体体类类型型时时,可可以以利利用用已
7、已定定义义的的另另一一个个结结构体类型来定义其成员的类型。构体类型来定义其成员的类型。第7页,本讲稿共68页 例例12.1 嵌套结构体类型定义的例子嵌套结构体类型定义的例子。struct date struct student int month;int num ;int day;char name20 int year;char sex,;int age;struct date birthday;char addr30;numnamesexage birthdaymonthdayyearaddr 结构类型结构类型student的的“birthday”数据项可以是一个已数据项可以是一个已经定义
8、的结构类型经定义的结构类型date第8页,本讲稿共68页 4 4.声明结构体类型变量声明结构体类型变量 (1)(1)先定义结构体类型再定义变量名。先定义结构体类型再定义变量名。定义了结构体类型定义了结构体类型 struct student 后,后,struct student char no7;char name9;char sex3;struct date birthday;可以用它定义变量。如:可以用它定义变量。如:struct student st1,st2;不能写成不能写成 struct st1,st2;第9页,本讲稿共68页 为了方便起见,可以在程序开头定义符号常量进为了方便起见,可
9、以在程序开头定义符号常量进行简化。如:行简化。如:#define STUDENT struct student 则在程序中可以直接写成:则在程序中可以直接写成:STUDENT char no7;char name9;char sex3;struct date birthday;STUDENT st1,st2;第10页,本讲稿共68页 (2)在定义类型的同时定义变量。在定义类型的同时定义变量。则一般定义形式为:则一般定义形式为:struct 结构体名结构体名 分量表;分量表;变量表;变量表;如:如:struct student char no7;char name9;char sex3;stru
10、ct date birthday;st1,st2;第11页,本讲稿共68页 (3)直接定义结构类型变量定义形式为直接定义结构类型变量定义形式为:struct 分量表分量表;变量表;变量表;在在 struct 后不出现结构体名,因此也不能再以此定义相同后不出现结构体名,因此也不能再以此定义相同的结构体变量。的结构体变量。如:如:struct char no7;char name9;char sex3;struct date birthday;st1,st2;第12页,本讲稿共68页1.结构变量的引用结构变量的引用 对对于于结结构构变变量量,要要通通过过成成员员运运算算符符“.”.”,逐逐个个访访
11、问问其其成员,访问的格式为:成员,访问的格式为:结构变量名结构变量名.成员成员 例如,例如,struct student st1,st2;st1.no,引用结构变量引用结构变量st1中的中的no成员;成员;st1.name 引用结构变量引用结构变量st1中的中的name成员,成员,st2.name 引用结构变量引用结构变量st2中的中的name成员,成员,也可以引用结构体变量以及变量成员的地址也可以引用结构体变量以及变量成员的地址例如,例如,&st1&st1.no其中的其中的“.”是成员是成员运算符运算符 12.3 12.3 结构体变量的初始化和引用结构体变量的初始化和引用第13页,本讲稿共6
12、8页如如果果某某成成员员本本身身又又是是一一个个结结构构类类型型,则则只只能能通通过过多多级级的的分分量量运运算,对最低一级的成员进行引用。算,对最低一级的成员进行引用。此时的引用格式扩展为:此时的引用格式扩展为:结构变量名结构变量名.成员成员.子成员子成员.最低最低1级子成员级子成员例如,引用结构变量例如,引用结构变量st1中的中的birthday成员的格式分别为:成员的格式分别为:st1.birthday.yearst1.birthday.monthst1.birthday.day(1)对对最最低低一一级级成成员员,可可像像同同类类型型的的普普通通变变量量一一样样,进进行行相相应应的各种运
13、算。的各种运算。第14页,本讲稿共68页 (2)只能对结构体变量的各分量进行输入输出,不能将一只能对结构体变量的各分量进行输入输出,不能将一个结构体变量直接进行输入输出。个结构体变量直接进行输入输出。scanf(“%s,%s,%s,%d,%d,%d”,&st1);错误错误 printf(“%s,%s,%s,%d,%d,%d”,st1);错误错误 scanf(“%s”,st1.name);正确正确 scanf(“%d”,&st1.birthday.day);正确正确 printf(“%s,%d”,st1.name,st1.birthday.day);正确正确 (3)分量和结构体变量的地址均可以被
14、引用。如:分量和结构体变量的地址均可以被引用。如:scanf(“%s”,st1.name);(输入输入st1.name的值的值)printf(“%x”,&st1);(以十六进制输出以十六进制输出st1的首地址)的首地址)第15页,本讲稿共68页2.结构变量的初始化结构变量的初始化结构变量初始化的格式,与一维数组相似结构变量初始化的格式,与一维数组相似:结构变量结构变量=初值表初值表 不不同同的的是是:如如果果某某成成员员本本身身又又是是结结构构类类型型,则则该该成成员员的初值为一个的初值为一个初值表初值表。例如:例如:st1=“000102”,“张三张三”,“男男”,1980,9,20 注注意
15、意:初初值值的的数数据据类类型型,应应与与结结构构变变量量中中相相应应成成员员所所要要求求的的一致,否则会出错。一致,否则会出错。第16页,本讲稿共68页 例例12.2 外部存储类的结构体变量初始化外部存储类的结构体变量初始化struct student1 long int num;char name20;char sex;char addr30;a=89031,“Li Lin”,M,“123 Beijing Road”;main()printf(“%ld,%s,%c,%sn”,a.num,a.name,a.sex,a.addr);输出结果输出结果:89031,Li Lin,M,123 Bei
16、jing Road第17页,本讲稿共68页 3.关于结构体类型的几点说明关于结构体类型的几点说明 (1)类型与变量是两个不同的概念。类型与变量是两个不同的概念。先定义结构体类型,再定义该类型变量。在编译先定义结构体类型,再定义该类型变量。在编译时,对时,对变量分配空间变量分配空间,对,对类型来说不存在分配空间。类型来说不存在分配空间。变量可以赋值、存取或运算,而类型没有这些操变量可以赋值、存取或运算,而类型没有这些操作。作。(2)结构体中的分量名可以与程序中的其它变量同名,它结构体中的分量名可以与程序中的其它变量同名,它们代表不同的对象,互不干扰们代表不同的对象,互不干扰。对结构体中的对结构体
17、中的分量可以单独使用分量可以单独使用。第18页,本讲稿共68页(3)不可以将两个结构变量进行关系比较不可以将两个结构变量进行关系比较非法语句非法语句struct temp int a;char ch;x1,x2;main()x1.a=10;x2.ch=a;if(x1=x2)第19页,本讲稿共68页 (4)(4)可以把一个结构体变量赋给另一个同类型的可以把一个结构体变量赋给另一个同类型的结构体变量结构体变量。struct temp int a;char ch;x1,x2;main()x1.a=10;x1.ch=a;x2=x1 printf(%d,%c,x2.a,x2.ch);把结构变量把结构变量
18、x1的值的值 赋给结构变量赋给结构变量x2.第20页,本讲稿共68页 (5)(5)结构体类型的变量在内存中占有一段连续的存结构体类型的变量在内存中占有一段连续的存储单元。占有连续存储单元的大小取决于成员的数据类储单元。占有连续存储单元的大小取决于成员的数据类型型.如如:struct exp int a;float b;char ch8;;struct exp x=1234,56.7,text结构体类型变量结构体类型变量x在内存在内存共占用共占用14个字节个字节的连续单元的连续单元第21页,本讲稿共68页(6)(6)可通过可通过sizeof()sizeof()运算符获得结构体变量占用的运算符获得
19、结构体变量占用的内存大小。内存大小。struct exp int a;float b;char ch8;x;main()int size;size=sizeof(x);printf(size=%dn,size);第22页,本讲稿共68页例例12.3 结构体成员的使用结构体成员的使用#include#include struct score int math;int eng;int comp;struct stu char name12;char sex;long StuClass;struct score sub;第23页,本讲稿共68页main()struct stu s1=LiMing,M
20、,990324,88,80,90;struct stu s2;clrscr();s2=s1;s2.name0=H;s2.name1=u;s2.StuClass=990325;s2.sub.math=83;printf(Record1%s,%c,%ld,%d,%d,%dn“,s1.name,s1.sex,s1.StuClass,s1.sub.math,s1.sub.eng,p);printf(Record2%s,%c,%ld,%d,%d,%dn,s2.name,s2.sex,s2.StuClass,s2.sub.math,s2.sub.eng,p);相同结构类型变量可相同结构类型变量可直接赋值直
21、接赋值第24页,本讲稿共68页12.412.4 结结 构构 体体 数数 组组结构体数组每个数组元素都是一个结构体类型的数据,结构体数组每个数组元素都是一个结构体类型的数据,且这些数据又分别包括各个分量。且这些数据又分别包括各个分量。结构体数组的定义、初始化等操作和内存中的存放方式结构体数组的定义、初始化等操作和内存中的存放方式与普通数组相类似。与普通数组相类似。1.结构体数组的定义结构体数组的定义与结构变量的定义相似,结构数组的定义也分直接定义与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。和间接定义两种方法,只需说明为数组即可。结构体类型名结构体类型名
22、 数组名数组名n例如:例如:struct student stu 3 struct BookLib Book4;第25页,本讲稿共68页 2.结构数组初始化结构数组初始化 与普通数组一样结构数组也可在定义时进行初始化。与普通数组一样结构数组也可在定义时进行初始化。初始化的格式为:初始化的格式为:结构数组结构数组n 初值表初值表1,初值表初值表2,.,初值表初值表n 例例12.4 用用结结构构类类型型 struct student 定定义义一一个个结结构构体体数数组组stu3,用于存储和显示三个学生的基本情况。,用于存储和显示三个学生的基本情况。#include struct.h struct
23、student stu 3=“000102”,“张三张三”,“男男”,1980,9,20,“000105”,“李四李四”,“男男”,1980,8,15,“000112”,“王五王五”,“女女”,1980,3,10 ;第26页,本讲稿共68页 main()int i;/*表示表示1个空格字符个空格字符*/printf(No.NameSexBirthdayn);for(i=0;i成员成员运运算算符符左左侧侧的的运运算算对对象象,只只能能是是指指向向结结构构变变量量(或或结结构构数数组组)的的指针变量指针变量。“-”称为指向运算符。称为指向运算符。(3)(*p).成员成员 (*p)表示表示p指向的结
24、构体变量,不得省去括号。指向的结构体变量,不得省去括号。这样就有:这样就有:st1.num 等价于等价于(*p).num 等价于等价于 p-num,第30页,本讲稿共68页 请注意:请注意:pn 得到得到p指向的结构体变量中的分量指向的结构体变量中的分量n的值。的值。pn+等价于等价于(pn)+得到得到p指向的结构体变量指向的结构体变量中的分量中的分量n的值,用完该值后加的值,用完该值后加1。+pn 等价于等价于+(p n)得到得到p指向的结构体变指向的结构体变量中的分量量中的分量n的值,并在用该值前,先加的值,并在用该值前,先加1。第31页,本讲稿共68页例例12.5指向结构体变量的指针变量
25、应用。指向结构体变量的指针变量应用。include“stdio.h”struct student char number9;char name8;char department20;main()struct student student1,*p;printf(“n学号学号:”);gets(student1.number);printf(n 姓名姓名:”);gets(student1.name);printf(“n 系名系名:”);gets(student1.department);p=&student1;printf(“n 学号学号:%s 姓名姓名:s 所在系所在系:%s”,(*p).num
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 优秀 课件
限制150内