《070-结构体、联合体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《070-结构体、联合体与枚举类型.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、结构体、联合体与枚举类型主要内容 n结构体n结构体的说明和定义n结构体成员的引用与结构体变量的初始化n结构体数组n结构体指针n结构体在函数间的传递n结构体指针型和结构体型函数n结构体嵌套n联合体n枚举类型一、结构体的说明和定义n结构体:C语言中的一种构造类型,通常是由不同数据类型的数据组成的集合体。n结构体与数组不同,数组是具有相同数据类型的数据组成的集合体。n结构体成员:构成结构体的数据,又称为结构体元素。每个成员具有不同名字与数据类型必要时也可具有相同的数据类型。n实例:学生记录,包括学号、姓名、性别等数据。n结构体的成员是通过其名字来引用的,而不像数组元素那样通过下标来引用。n结构体的作
2、用:n为处理复杂的数据结构提供了手段。n为函数间传递不同类型的参数提供了便利。n对数据结构较为复杂的大型程序提供了方便。结构体的说明n格式:存储类型 struct 结构体名 数据类型 结构体成员名1;数据类型 结构体成员名2;.;n结构体成员可以是简单变量、数组、指针、结构体、联合体等。n例:struct date int year;int month;int day;int yearday;结构体变量的定义三种方式n在结构体说明的同时定义结构体变量。n如:struct example char*name;int age;gao,zhang;n直接定义结构体变量。n如:struct char*
3、name;int age;gao,zhang;n未给出结构体名n把定义和说明分开。n如:struct example char*name;int age;struct example gao,zhang;n结构体变量占用内存的大小可用sizeof()运算来求出。二、结构体成员的引用与结构体变量的初始化 结构体成员的引用n一般格式:n结构体变量名.成员名 n“.为成员运算符,其结合性为从左到右。n例:struct example long int id;char*name;char address100;gao;各成员的引用:gao.idgao.namegao.address 或 gao.add
4、ressi结构体变量的初始化n结构体变量的初始化:在定义结构体变量的同时,对其成员变量赋初值。n一般格式:struct 结构体名 结构体变量名=初始数据;struct date int year;int month;int day;char monthname4;;struct date date1=2007,9,1,Sept;n【例】把一个学生的信息放在一个结构体变量中,然后输出这个学生的信息。n【例】输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。三、结构体数组 结构体数组的定义n一般格式:存储类型 struct 结构体名 结构体数组名表达式1.表达式n;结构体数组的
5、初始化n一般格式:存储类型 struct 结构体名 结构体数组名表达式1.表达式n=初始数据;结构体数组的应用举例n【例】有3个候选人,每个选民只能投票选一人。要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人的得票结果。结构体数组的应用举例n【例】有N个学生的信息(包括学号、姓名、成绩),要求按照成绩的上下顺序输出各学生的信息。四、结构体指针n结构体指针:指向结构体数据的指针。结构体指针及其定义n格式:存储类型 struct 结构体名 *结构体指针名;n例如:static struct example*pexample;n结构体指针存放结构体首地址,其运算规那么同一般指针。通过指针
6、引用结构体成员n格式1:(*结构体指针名).成员名n格式2:结构体指针名-成员名n【例】通过指向结构体变量的指针变量输出结构体变量中成员的信息。n【例】有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。五、结构体在函数间的传递n结构体变量在函数间的传递n两种方式:n地址复制方式:实参为结构体变量的地址,形参为相应的结构体类型指针。n数据复制方式:实参、形参均为相应的结构体变量。n结构体数组在函数间的传递n在传递结构体数组时,通常实参为数组名或指针,形参为指针或数组。n【例】有N个结构体变量stu,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3
7、门课程成绩和平均成绩)。六、结构体型和结构体指针型函数结构体型函数n结构体型函数:返回值为结构体数据的函数。n定义格式:struct 结构体名 函数名(形参表)形参说明;内部数据说明语句;执行语句;n说明格式:struct 结构体名 函数名();n【例】假设有一个学生表,给定一个学生的学号,输出其有关信息。结构体指针型函数n结构体指针型函数:返回值为结构体数据的地址的函数。n定义格式:struct 结构体名 *函数名(形参表)形参说明;内部数据说明语句;执行语句;n说明格式:struct 结构体名 *函数名();n【例】假设有一个学生表,给定一个学生的学号,输出其有关信息。七、结构体嵌套n结构
8、体嵌套:结构体的某个成员的类型又是一个结构体。struct date int year;int month;int day;struct person char id6;char name30;char sex;struct date birthday;stu;nbirthday为struct date类型,具有month、day和year三个成员。n递归结构体:结构体的某个成员的类型又是该结构体本身。n例:struct example int data;struct example *next;n嵌套结构体类型变量成员的引用格式:n结构体变量名.外层成员名.内层成员名n结构体指针名-外层成员
9、名.内层成员名n如:struct add int post;char addr100;char tel8;struct person char name30;struct add wadd;struct add hadd;struct person Li;struct person *pman;Li.name pmanname pman hadd.postpmanwadd.post pmanwadd.tel八、联合体n联合体是一种类似于结构体的构造型数据类型,准许不同类型和不同长度的数据共享同一块存储空间。n联合体类型变量所占用的空间,在程序运行时的不同时刻,可维持不同类型和不同长度的数据。在
10、任何时刻,只有一个成员变量的值有意义。n联合体实质上采用了覆盖技术,准许不同类型的数据互相覆盖。联合体的说明n格式:union 联合体名 类型标识符 成员名1;类型标识符 成员名n;n例:union area char c_data;short s_data;long l_data;联合体变量的定义n说明与定义分开union 联合体名 类型标识符 成员名1;类型标识符 成员名n;union 联合体名 变量名表;n例如:union uniontype int a;long b;union uniontype my_data;n定义与说明合在一起。union 联合体名 数据类型标识符 成员名1;数
11、据类型标识符 成员名n;变量名表;n例如:union uniontype int a;long b;my_data;n定义和说明合在一起,但缺省联合体名。union 数据类型标识符 成员名1;数据类型标识符 成员名n;变量名表;n例如:union int a;long d;my_data;n联合体变量所占用的存储空间,由其占用空间最多的成员决定。n结构体与联合体可以互相嵌套。n例如:union uniontype int i;float f;struct structtype short s;long l;struct sutype char c;union uniontype u;;unio
12、n ustype int i;struct structtype st;联合体变量成员的引用n联合体变量成员的引用类似结构体变量,也是利用运算符“和“.。n例如:union uniontype int i;char c;my_data;union uniontype *p;p=&my_data;引用方式:my_data.imy_data.cp-ip-cn联合体变量与结构体变量的区别:n结构体变量的所有成员都同时驻留在该结构体变量所占用的空间中,而对于联合体变量,仅有一个成员驻留在该联合体变量所占用的空间中。n结构体变量的所有成员都可以初始化,而对于联合体变量,只能初始化其中的一个成员。n【例】
13、建立教师和学生登记表,其中包括识别号、姓名、身份和职称。假设身份是“student,那么职称一栏填年级;假设身份是“teacher,那么职称栏填职称。九、枚举类型 n枚举类型是一种数据类型。对那些只可能取有限的某几种值的数据,可以定义为枚举类型数据。n典型的枚举类型数据:n星期:星期一、星期二、星期日n性别:男、女枚举类型的说明n格式:enum 枚举名元素名1,元素名2,元素名n;n例如:/该枚举类型只准许取12种值 enum month Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec;/该枚举类型只准许取7种值enum weekday Sun,
14、Mon,Tue,Wed,Thu,Fri,Sat;n枚举类型说明中的元素作为常量名处理,不是变量名。这些常量依序分别为0、1、n-1。n如:nenum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;n其中,各枚举元素的值分别为0、1、2、3、4、5、6。n枚举元素是常量,不是变量,不能对它赋值。n如:nsun=0;mon=1;错n枚举元素的值也可在定义时指定。对于没有指定值的元素,其取值原那么仍按所处的顺序取。n如:nenum weekday Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;n其中,Tue是2,Wed是3,Sat是6。枚举类型变量的定义n
15、枚举类型变量的定义也有三种方式:n说明与定义合一。如:enum weekday Sun,Mon,Tue day;n无枚举类型名。如:enum Sun,Mon,Tue day;n说明与定义分开。如:enum weekday Sun,Mon,Tue;enum weekday day;n可用枚举变量进行判断或比较操作。n如:nenum flag true,false my_flag;n.nif(my_flag=true)n.n一个整数不能直接赋给枚举变量,要先进行强制类型转换才能赋值。n如:nenum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat workday;nwork
16、day=6;错nworkday=(enum weekday)6;对n workday=Sat;n【例】口袋中有红、黄、蓝、白、黑5种颜色的球假设干个。每次从口袋中先后取出个球,求得到3种不同色的球的可能取法,输出每种排列的情况。十、自定义类型n自定义类型即类型定义,用于给已存在的数据类型指定别名或重新命名。n一般格式:ntypedef oldtype newtype_list;n例如:ntypedef int INTEGER;/INTEGER为整形int nint a,b;n INTEGER a,b;n自定义类型的优点n增强程序的可读性和可移植性。typedef char*STRING;/STRING为字符指针类型STRING p,s10 ;/p为字符指针变量,s为指针数组typedef struct student char *name;int number;STU;/STU为struct student结构体类型 nSTU stu1;/stu1拥有name和number两个成员typedef int NUM10;/NUM为整型数组类型NUM n;/n为整型数组类型变量 typedef int (*POINTER)();/POINTER为函数指针类型POINTER p1,p2;/p1和p2为POINTER类型的指针变量