第9章结构体、共用体和枚举类型数据.ppt
《第9章结构体、共用体和枚举类型数据.ppt》由会员分享,可在线阅读,更多相关《第9章结构体、共用体和枚举类型数据.ppt(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 stuint 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为student 结构型变量,x1,x2可存放student类
3、型数据。,类型标识符,结构体变量定义:,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 addr30;,x1,x2;,1.类型名与变量名是不同的概念2.每一个成员的作用
4、如同该类型的变量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 student x1=8906,Li Ming,M,85.5;,如:struct student,unsigned No;
5、,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;,如:x1为struct student型变量,则 x1.No:表示x1的学号 x1.name:表示x1的名字,访问结构变量实质上是引用其成员;有两种运算
6、符可访问结构成员,1)圆点运算符,3、结构体变量的引用,注意:,1.只能用变量的成员,不可用结构变量名直接运算。,2.每一个成员的作用与其同类型的简单变量的引用相同。,2)箭头运算符:,例:struct student,char name 10;char sex;int age;float score;char addr20;x1;struct student p;,则p为结构指针变量,它可用来存放student型变量的地址,令 p=,则 p为x1的首地址.,访问结构成员:,pname 表示x1的姓名;等价于(*p).name或x1.name,page 表示x1的年龄;等价于(*p).age或
7、x1.age,若有 struct student h;,则:scanf(%s,printf(%s,h);,错误,原因:结构体变量中包含有多个不同类型的数据项。正确方法:对结构体变量各成员的值进行输入/输出。,如上例:scanf(%d%s,只能对结构变量的成员进行输入/输出,4、结构体的输入和输出,1、结构体数组的定义,结构数组的定义方法和结构变量相似(也有三种方法),只需说明它为数组类型即可。例如:,9.1.3 结构体数组,struct stuint num;char*name;char sex;float score;boy5;,struct stuint num;char*name;cha
8、r sex;float score;struct stu boy5;,struct int num;char*name;char sex;float score;boy5;,对外部结构数组或静态结构数组可以作初始化赋值,例如:struct stuint num;char*name;char sex;float score;boy5=101,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、结构体数组的
9、初始化,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,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,min
10、icomputer,1、指向结构体变量的指针,一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。结构指针变量说明的一般形式为:struct 结构名*结构指针变量名例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:struct stu*pstu;当然也可在定义stu结构时同时说明pstu。,9.1.5 结构体变量与指针,与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则:p
11、stu=&boy是正确的,而:pstu=&stu是错误的。,其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量-成员名例如:(*pstu).num 或者:pstu-num应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。,2、指向结构体数组的指针,指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素
12、,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。例 用指针变量输出结构数组。,main()struct stu*ps;printf(NotNametttSextScoretn);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,
13、58,;,应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。ps=(赋予0号元素首地址),9.2 共用体类型数据,9.2.1 共用体的概念,什么是共用体?它是几个不同的变量共同占用同一段内存空间的结构。这几个不同的变量可以具有不同的类型,但具有相同的指针(地址)。定义共用体 union 共用体名 成员表列;例如:union data int x;char y;float z;,1、共用体变量的定义,共用体变量的说明和结构变量的说明方式相同,也有三种形式。,union data
14、 int x;char y;float z a,b;,union/*无类型名*/int x;char 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)共用体变量的地址和它的各成员的
15、地址都相同。即&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(学生)时,第3项采用class(班级);job为t(教师)时,第3项采用position(职务)。,5、
16、共用体变量的应用,Struct char name20;char job;union int class;char position10;cat;person10;,main()int n;for(n=0;n10;n+)scanf(“%s%c”,personn.name,,9.3 枚举类型数据,9.3.1 枚举型数据基本概念,所谓“枚举”类型,是指这种类型的变量的值只能是指定的若干个名字之一。定义枚举类型:enum 枚举类型名元素表;例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;定义了一个枚举类型weekday,该类型只包含7个枚举元素sun、mon、t
17、ue、wed、thu、fri、sat,这些枚举元素都是常量。,定义枚举变量有3种方式:先定义枚举类型再定义枚举变量。例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;enum weekday workday,weekend;定义枚举类型的同时定义枚举变量。例如:enum weekdaysun,mon,tue,wed,thu,fri,sat workday,weekend;直接定义枚举变量。例如:enumsun,mon,tue,wed,thu,fri,satworkday,weekend;变量workday、weekend只能取常量sun、mon、tue、we
18、d、thu、fri、sat 中的一个。定义一个枚举变量后,就可将一个枚举常量赋予它,例如:workday=wed;,9.3.2 枚举型变量的定义,枚举元素是符号常量,不能为其赋值。例如:sun=1 是错误的。枚举元素的值:枚举元素作为符号常量,是有值的,例如上面的的sun、sat 的值分别是0、1、2、6,即第一个元素的值自动为0,其后的元素自动依次加1。枚举元素的值在定义枚举类型时,也可由用户指定,例如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;则tue,wed,thu,fri,sat依次为2、3、4、5、6。当把一个枚举常量赋予一个枚举变量后,
19、该变量就有了该常量的值。例如:workday=mon;printf(“%d”,workday);则输出1。或者说枚举变量的值是通过枚举常量间接获得的。,9.3.3 枚举型变量的引用,枚举值是可比较的。枚举值的大小依据枚举元素的值而定。例如:mon 小于tue,而 sat 大于wed。所以可用于下面的语句:if(workday sun)if(workday=sun)不能把一个整数直接赋予枚举变量。例如:workday=2;是错误的,原因在于它们类型不一致,可通过强制类型转换把一个整数直接赋予枚举变量,例如:workday=(enum weekday)2;是可行的。,严格的说,枚举变量和常量是不能
20、做算术运算的,例如workday+、weekend=workday+wed是不允许的,但有些系统采用警告的方式,但不禁止,也就是说系统将按枚举变量和常量的值做算术运算。,9.4 用TYPEDEF定义类型,9.4.1.typedef的概念,用用户喜欢的名字来替换这些类型名,再用用户自定义这些类型名去定义相关的变量。例如:typedef int INTEGER;/*用INTEGER 代替int 类型*/typedef float REAL;/*用REAL代替float 类型*/INTEGER a,b;/*定义整型变量a,b*/REAL x,y/*定义实型变量x,y*/,typedef int IN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举 类型 数据
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5641608.html