结构体、共用体和枚举类型数据

上传人:san****019 文档编号:70824987 上传时间:2019-01-18 格式:PPT 页数:73 大小:831.01KB
返回 下载 相关 举报
结构体、共用体和枚举类型数据_第1页
第1页 / 共73页
结构体、共用体和枚举类型数据_第2页
第2页 / 共73页
结构体、共用体和枚举类型数据_第3页
第3页 / 共73页
结构体、共用体和枚举类型数据_第4页
第4页 / 共73页
结构体、共用体和枚举类型数据_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《结构体、共用体和枚举类型数据》由会员分享,可在线阅读,更多相关《结构体、共用体和枚举类型数据(73页珍藏版)》请在金锄头文库上搜索。

1、第9章 结构体、共用体和枚举类型数据,9.1 结构体类型数据 9.2 共用体类型数据 9.3 枚举类型数据 9.4 用TYPEDEF定义类型 9.5 动态存储分配链表,9.1 结构体类型数据,9.1.1. 结构体的概念及其定义,结构体概念,“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型,在说明和使用之前必须先定义它,如同在说明和调用函数之前要先定义函数一样。,结构体(structure)相当于其它高级语言中的“记录”。,num name sex score age addr,结构体的定义,定义一个结

2、构的一般形式为: struct 结构名 成员表列 ;,struct stu int num; char name20; char sex; float score; ;,成员名的命名应符合标识符的书写规定。例如:,对每个成员也必须作类型说明,其形式为: 类型说明符 成员名;,9.1.2 结构体类型变量的定义和引用,1)先定义结构体类型再定义结构体变量,例: struct student int num; char name20; char sex; int age; float score; char addr30; ;,struct student x1, x2;,则 x1, x2为stud

3、ent 结构型变量,x1, x2可存放student类型数据。,类型标识符,结构体变量定义:,1、结构体类型变量的定义(方法有三),例:struct student int num; char name20; char sex; int age; char addr30; x1, x2;, 成员表列 变量名表列;,2)在定义结构体类型的同时定义变量:,定义形式 struct 结构体名,定义形式 struct 成员表列 变量名表列; 不出现结构体类型名,3. 直接定义结构类型变量,如:struct, int num,char name20;,char sex;,int age;,char add

4、r30;, x1, x2;,1. 类型名与变量名是不同的概念 2. 每一个成员的作用如同该类型的变量 3. 成员名与程序中的变量名可相同但意义不同,几点 说明:,struct date int month; int day; int year; ;,补充:结构体的嵌套定义,struct student int num; char name20; char sex; int age; struct date birthday; char addr30; x1, x2;,2、 结构体变量初始化,结构的初始化就是指结构变量的初始化;先定义结构,在定义结构变量时对每个成员赋初值,struct stud

5、ent x1=8906, “Li Ming “, M, 85.5;,如:struct student, unsigned No;,char name20;,char sex;,float score;,;,若 x1 的起始地址为2000,则 x1 在内存中占有的存储单元为:,共用27个字节的连续单元,结构定义与变量定义及初始化合二为一:,struct exp, int a;,float b;,char yn8;, x=1234, 56. 7, “test“;,但不能这样写:,struct exp, int a=1234;,float b=56.7;,char yn8=“test“;, x;,如

6、:x1为struct student型变量,则 x1.No: 表示x1的学号 x1.name: 表示x1的名字,访问结构变量实质上是引用其成员;有两种运算符可访问结构成员,1)圆点运算符,3、结构体变量的引用,注意:,1. 只能用变量的成员,不可用结构变量名直接运算。,2. 每一个成员的作用与其同类型的简单变量的引用相同。,2)箭头运算符:,例:struct student, char name 10; char sex; int age; float score; char addr20; x1; struct student p;,则p为结构指针变量,它可用来存放student型变量的地址

7、,令 p=,则 p为x1的首地址.,访问结构成员:,pname 表示x1的姓名;等价于 (*p).name或x1.name,page 表示x1的年龄;等价于 (*p).age或x1.age,若有 struct student h;,则:scanf(“%s“, ,printf(“%s“, h);,错误,原因:结构体变量中包含有多个不同类型的数据项。 正确方法:对结构体变量各成员的值进行输入/输出。,如上例:scanf(“%d%s“, , 只能对结构变量的成员进行输入/输出,4、结构体的输入和输出,1、 结构体数组的定义,结构数组的定义方法和结构变量相似(也有三种方法),只需说明它为数组类型即可。

8、例如:,9.1.3 结构体数组,struct stu int num; char *name; char sex; float score; boy5;,struct stu int num; char *name; char sex; float score; ; struct stu boy5;,struct int num; char *name; char sex; float score; boy5;,对外部结构数组或静态结构数组可以作初始化赋值,例如: struct stu int num; char *name; char sex; float score; boy5= 101,

9、“Li ping“,“M“,45, 102,“Zhang ping“,“M“,62.5, 103,“He fang“,“F“,92.5, 104,“Cheng ling“,“F“,87, 105,“Wang ming“,“M“,58 ;,注:当对全部元素作初始化赋值时,也可不给出数组长度。,2、结构体数组的初始化,main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; printf(“s=%fn“,s); ave=s/5; printf(“average=%fncount=%dn

10、“,ave,c); ,3、结构体数组的引用,9.1.4 结构体变量作为函数参数,struct tree int x; char *s; t; void fun(struct tree a ) printf(“%d, %sn“, a.x, a.s); ,#include main( ) t.x=6; t.s=“minicomputer“;fun(t); ,结果:6, minicomputer,1、指向结构体变量的指针,一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。 结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名 例

11、如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为: struct stu *pstu; 当然也可在定义stu结构时同时说明pstu。,9.1.5 结构体变量与指针,与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。 赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则: pstu=&boy 是正确的,而: pstu=&stu 是错误的。,其访问的一般形式为: (*结构指针变量).成员名 或为: 结构指针变量-成员名 例如: (*pstu).num 或者: pstu-num 应该

12、注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。,2、指向结构体数组的指针,指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。 设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。 例 用指针变量输出结构数组。,main() struct stu *ps; printf(“NotNamet

13、ttSextScoretn“); for(ps=boy;psnum,ps-name,ps-sex,ps-score);,struct stu int num; char *name; char sex; float score; ,boy5= 101,“Zhou ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“Liou fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58, ;,应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取

14、一个成员的地址来赋予它。因此,下面的赋值是错误的。 ps=(赋予0号元素首地址),9.2 共用体类型数据,9.2.1 共用体的概念, 什么是共用体?它是几个不同的变量共同占用同一段内存空间的结构。这几个不同的变量可以具有不同的类型,但具有相同的指针(地址)。 定义共用体 union 共用体名 成员表列 ; 例如:union data int x; char y; float z; ;,1、共用体变量的定义,共用体变量的说明和结构变量的说明方式相同, 也有三种形式。,union data int x; char y; float z a,b;,union /*无类型名*/ int x; char

15、 y; float z a,b;,union data int x; char y; float z ; union data a,b;,9.2.2 共用体变量,2、 共用体与结构体比较,3、 共用体变量的引用,(1)虽然共用体变量可以存储几种不同类型的成员,但在在同一时刻,只能存储其中的一个,即只能有一个成员起作用。 (2)共用体变量中起作用的是最后一次存放的成员,以前存放的成员皆失效。例如顺序执行 a.x=12; a.y=A; a.z=23.5;语句后,只有成员a.z 有效。 (3)共用体变量的地址和它的各成员的地址都相同。即&a、&a.、&a.、&a.的地址都相同。,4、 共用体类型数据特点,(4)不能单独引用共用体变量名,也不能在定义共用体变量时对其初始化。 例如:union data int x; char y; float z a=12,E,12.5; a=12;m=a; 都是错误的。 (5)在结构体类型的定义中可以有共用体类型的成员;也可定义共用体类型的数组。反之亦然。,例 建立学生与教师的简表,内容有:name、job、class、position。表中前2项一样,第3项采用共用体数据:即job为s(学生)时,第

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

最新文档


当前位置:首页 > 高等教育 > 大学课件

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