孙鑫vc++教程之第05节 结构体、联合体、枚举

上传人:子 文档编号:54211160 上传时间:2018-09-09 格式:PPT 页数:49 大小:173KB
返回 下载 相关 举报
孙鑫vc++教程之第05节 结构体、联合体、枚举_第1页
第1页 / 共49页
孙鑫vc++教程之第05节 结构体、联合体、枚举_第2页
第2页 / 共49页
孙鑫vc++教程之第05节 结构体、联合体、枚举_第3页
第3页 / 共49页
孙鑫vc++教程之第05节 结构体、联合体、枚举_第4页
第4页 / 共49页
孙鑫vc++教程之第05节 结构体、联合体、枚举_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《孙鑫vc++教程之第05节 结构体、联合体、枚举》由会员分享,可在线阅读,更多相关《孙鑫vc++教程之第05节 结构体、联合体、枚举(49页珍藏版)》请在金锄头文库上搜索。

1、第五节、结构体、联合体、枚举,目标: 1、结构体应用 2、联合体应用 3、枚举的应用 4、自定义数据类型,一、 结构体类型,例子:新生入学登记表,要记录每个学生的学号,姓名,性别,年龄,身份证号,家庭住址,家庭联系电话等信息。,使用数组:因为要有很多学生的信息要处理,按照我们前面学习过的知识,这个任务要使用数组。但是数组是由相同类型的数据构成。所以我们可以使用7个单独的数组(学号数组no、姓名数组name、性别数组sex、年龄数组age、身份证号数组pno、家庭住址数组addr、家庭联系电话数组tel)分别保存这几类信息。分立的几个数组将给数据的处理造成麻烦,但很多计算机语言只能这样处理(如:

2、早期的FORTRAN,PASCAL,BASIC)。,使用结构体:C语言利用结构体将同一个对象的不同类型属性数据,组成一个有联系的整体。也就是说可以定义一种结构体类型将属于同一个对象的不同类型的属性数据组合在一起。本例可以将属于同一个学生的各种不同类型的属性数据组合在一起,形成整体的结构体类型数据。可以用结构体类型变量存储、处理单个学生的信息。,结构体是一种自定义数据类型。如果要存储、处理多个学生(对象)的信息,可以使用数组元素为结构体类型的数组,其中每个元素是一个学生(对象)的相关的整体的信息。1结构体类型和结构体变量结构体是一种构造类型(自定义类型),除了结构体变量需要定义后才能使用外,结构

3、体的类型本身也需要定义。结构体由若干“成员”组成。每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造类型。,1、结构体类型定义的一般形式,说明: (1)结构体名:结构体类型的名称。遵循标识符规定。 (2)结构体有若干数据成员,分别属于各自的数据类型,结构体成员名同样遵循标识符规定,它属于特定的结构体变量(对象),名字可以与程序中其它变量或标识符同名。,(3)使用结构体类型时,struct 结构体名作为一个整体,表示名字为“结构体名”的结构体类型。 (4)结构体类型的成员可以是基本数据类型,也可以是其它的已经定义的结构体类型-结构体嵌套。结构体成员的类型不能是正在定义的结构体类型(递归

4、定义,结构体大小不能确定),但可以是正在定义的结构体类型的指针。,例如:定义关于学生信息的结构体类型。 struct student int no; char name20;char sex;int age; char pno19; char addr40; char tel10; ;,说明: (1)struct student是结构体类型名,struct是关键词,在定义和使用时均不能省略。 (2)该结构体类型由7个成员组成,分别属于不同的数据类型,分号“;”不能省略。成员含义同前。 (3)在定义了结构体类型后,可以定义结构体变量(int整型类型,可以定义整型变量)。,(4)由于结构体是一种自

5、定义的数据类型,概 念上等同于int,char等数据类型。因此,定义了结构体后,并不分配内存空间。只有定义了结构体变量后,才分配内存空间。定义了结构体,只是知道了结构体数据类型的大小。,2、结构体变量的定义(三种方法) (1)先定义结构体类型,再定义结构体变量(概念、含义相当清晰),即:结构体类型定义;结构体变量定义;其中:结构体变量定义:,例如: struct student; /* 类型定义,定义结构体类型struct student */ struct student student1,student2; /* 变量定义,定义2个类型为struct student的结构体变量studen

6、t1,student2 */,(2)定义结构体类型的同时定义结构体变量。,例如: struct studentstudent1,student2; 说明: 这一种紧凑的格式,既定义类型,也定义变量;如果需要,在程序中还可以使用所定义的结构体类型,定义其它同类型变量。,(3)直接定义结构体变量(不给出结构体类型名,匿名的结构体类型),例如:struct.student1,student2;结构体类型、变量是不同的概念: 在定义时一般先定义一个结构体类型,然后定义变量为该类型; 赋值、存取或运算只能对变量,不能对类型; 编译时只对变量分配空间,对类型不分配空间。,结构体变量的引用 1、)引用结构体

7、变量中的一个成员 结构体变量名.成员名 其中:“.”运算符是成员运算符。 例如: student1.num=11301; scanf(“%s”,student1.name); if(strstr(student1.addr,”shanxi”)!=NULL).; student1.age+;,2、)成员本身又是结构体类型时的子成员的访问-使用成员运算符逐级访问。 例如: student1.birthday.year student1.birthday.month student1.birthday.day 3、)同一种类型的结构体变量之间可以直接赋值(整体赋值,成员逐个依次赋值)。 例如:stu

8、dent2=student1;,4、)不允许将一个结构体变量整体输入/输出 例如: scanf(“%.”, 都是错误的。3结构体变量的初始化 结构体变量也可以在定义时进行初始化,但是变量 后面的一组数据应该用“”括起来,其顺序也应 该与结构体中的成员顺序保持一致。,本例中,结构体变量student1在定义的同时,其各个成员也按顺序被赋予了相应的一组数据。4、结构体与数组的比较我们前面学过数组,数组是同种类型的变量的集合,占用一个连续的空间。而结构体,我们通过结构体的定义,我们可以看到,结构体也是一些变量的集合,不过是不同类型的变量的集合。不同的类型,大小也不一致。那么他们的排列就会有一个对齐的

9、问题。我们看例子:,typedef struct _tagData char a;int b; DATA; int main(int argc, char* argv) DATA aa;aa.a = a;aa.b = 1000;printf(“sizeof(aa) = %dn“,sizeof(aa);printf(“aa.a = %#x,aa.b = %#xn“, ,运行结果:,例子显示结构体DATA中的大小是8字节,可是通过结构体的定义,我们看到只有5个字节。在结构体变量中,a的地址是0x12ff78,而b的地址是0x12ff7c,这中间有三个字节空间没有使用。答案就是,它确实没有使用,原因

10、是32位的cpu通常是4字节的整数倍的内存地址中读取数据的。所以编译器为了优化代码,往往会根据变量的大小,将其指定到合适的位置,这就是我们说的内存对齐。,例如: struct char a;int b;char c;int d;char e;int f;char g;int i; X;,struct char a;char c;char e;char g;int b;int d;int f;int i; Y;,这两个结构体,定义上是完全一样的,只是两者 在内部排列顺序上不一致。 我们计算这两个变量X,Y的大小时,得到的结果 如下:我们可以看到,不同的排列导致结构体占用的内 存大小不一样,差别非

11、常明显。 因此,我们在定义结构体时,要遵循: 同种类型的定义放在一起。如:Y的定义那样。,5、结构体数组,结构体数组-数组元素的类型为结构体类型的数组。 C语言允许使用结构体数组存放一类对象的数据。 i.结构体数组的定义 类似结构体变量定义,只是将“变量名”用“数组名长度”代 替),也有3种方式。 1、)先定义结构体类型,然后定义结构体数组: struct 结构体名 ; struct 结构体名 结构体数组名; 2、)定义结构体类型同时定义结构体数组: struct 结构体名 结构体数组名数组的长度; 3、)匿名结构体类型 struct 结构体数组名数组的长度;,例如:定义30个元素的结构体数组

12、stu,其中每个元素都是 struct student类型。struct student char name20;char sex; char pno19;char addr40; char tel20;int age; int no; stu30;,定义了结构体数组后,可以采用:数组元素.成 员名。引用结构体数组某个元素的成员,结构体 数组的初始化.在对结构体数组初始化时,要将 每个元素的数据用“”括起来。6结构体指针变量 结构体指针变量:指向结构体变量的指针变量。 结构体指针变量的值是结构体变量(在内存中 的)起始地址。,结构体指针变量,ii.结构体指针变量 1)结构体指针变量的定义: s

13、truct 结构体名 *结构体指针变量名; 例如:struct student *p;定义了一个结构体指针变量,它可以指向一个struct student结构体类型的数据。2)通过结构体指针变量访问结构体变量的成员:(两种访问形式) (1)(*结构体指针变量名).成员名。(理解:*结构体指针变量名=所指向的结构体变量名,注意:“.”运算符优先级比“*”运算符高),(2) 结构体指针变量名-成员名(其中:“-”是指向成员运算符,很简洁,更常用) 例如:可以使用(*p).age或p-age访问p指向的结构体的age成员。 例3:用指针访问结构体变量及结构体数组 (数组的指针就是指向其元素的指针,访

14、问数组元素和访问变量所需要定义的指针变量完全相同;指向数组元素和指向变量的指针变量在使用上也完全相同)。参见:example3,iii.结构体变量、结构体指针变量作函数参数结构体变量、结构体指针变量都可以像其它数据类型一样作为函数的参数,也可以将函数定义为结构体类型或结构体指针类型(返回值为结构体、结构体指针类型)。例4:对年龄在19岁以下(含19岁)同学的成绩增加10分。 参见:example2,二 联合体(联合,共同体),联合体:将不同类型的数据项存放于同一段内存 单元的一种构造数据类型。与结构类似,在联合体内可以定义多种不同数据类型的成员;区别是,在联合体类型变量所有成员共用一块内存单元

15、。(虽然每个成员都可以被赋值,但只有最后一次赋予的成员值能够保存且有意义,前面赋予的成员值被后面赋予的成员值所覆盖),iv.联合体类型、联合体类型变量的定义 1、联合体类型定义的一般形式:,2、联合体类型变量的定义,方法同结构体变量的定义(三种形式,同时,前后,匿名) 例如:,v.联合体变量的引用 对联合体变量的赋值,使用都是对变量的成员进行的, 联合体变量的成员表示为: 联合体变量名.成员名 使用联合体类型数据时应注意联合体数据的特点:(1)同一内存段可以用来存放不同类型的成员,但是每一瞬时只能存放其中的一种(也只有一种有意义)。(2)联合体变量中有意义的成员是最后一次存放的成员。例如:在x

16、.a=1;x.b=3.6;x.c=H语句后;当前只有x.c有意义(x.a,x.b也可以访问,但没有实际意义)。,(3)联合体变量的地址和它的成员的地址都是同一地址。即,&x.a=&x.b=&x.c=&x。 (4)除整体赋值外,不能对联合体变量进行赋值,也不能企图引用联合体变量来得到成员的值。不能在定义联合体变量时对联合体变量进行初始化(系统不清楚是为哪个成员赋初值); (5)可以将联合体变量作为函数参数,函数也可以返回联合体,联合体指针。 (6)联合体,结构体可以相互嵌套。,例10:学校的人员数据管理,教师的数据包括:编号、姓名、性别、职务。学生的数据包括:编号、姓名、性别、班号。如果将两种数据放在同一个表格中,那么有一栏,对于教师登记教师的“职务”,对于学生则登记学生的“班号”(对于同一人员不可能同时出现)。写出类型定义。 解:,Struct personInt no;Char name20;Bool sex;Union char banhao20;char zhiwu20;,

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

最新文档


当前位置:首页 > 生活休闲 > 科普知识

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