1、第九章 结构体、共用体与枚举类型 张乐乐C语言程序设计9.1.1 9.1.1 结构体类型的结构体类型的定义定义 struct 结构体名结构体名 数据类型数据类型1 成员名成员名1;数据类型数据类型2 成员名成员名2;数据类型数据类型n 成员名成员名n;/*此行的分号不能少此行的分号不能少*/结构体类型定义的一般形式:结构体类型定义的一般形式:lstructstruct为关键字;为关键字;l结构体名结构体名是用户定义的是用户定义的类类型标识型标识。l 中是组成该结构体的中是组成该结构体的成员成员。成员的。成员的数据类型数据类型可可以是以是C语言所允许的任何语言所允许的任何数据类型数据类型。9.1
2、.1 9.1.1 结构体类型的结构体类型的定义定义struct student long num;char name20;char sex;int age;float score;char addr30;例例9.1:定义学生档案信息:定义学生档案信息结构类型结构类型:成员表列成员表列 struct是类型是类型关键字关键字后分号不能少,后分号不能少,表明语句结束。表明语句结束。结构体名结构体名9.1.1 9.1.1 结构体类型的结构体类型的定义定义 2.结构体类型特点结构体类型特点:(1)(1)结构体类型由多个成员组成,成员的数据类型可以是结构体类型由多个成员组成,成员的数据类型可以是整型、实型
3、、字符型、数组整型、实型、字符型、数组 ,也允许是另一个已经定义的,也允许是另一个已经定义的结构体类型。结构体类型。(2)(2)结构体类型系统没有预先定义,凡需要使用结构体类结构体类型系统没有预先定义,凡需要使用结构体类型数据的,都必须在程序中自己定义。可根据设计者的需型数据的,都必须在程序中自己定义。可根据设计者的需要来组合的。要来组合的。(3)(3)定义一个结构体类型,系统不会为其分配内存单元。定义一个结构体类型,系统不会为其分配内存单元。定义一个类型只是表示这个类型的结构,即告诉系统它定义一个类型只是表示这个类型的结构,即告诉系统它由由哪些类型的成员构成,哪些类型的成员构成,各占多少个字
4、节,各按什么形式存各占多少个字节,各按什么形式存储,并把它们当作一个整体来处理。储,并把它们当作一个整体来处理。9.1.2 9.1.2 结构体变量结构体变量-(1)先定义结构体类型再定义变量名先定义结构体类型再定义变量名l语法格式语法格式:struct 结构体名结构体名 变量名表;变量名表;例如:例如:struct date date1;struct student s,t1,t2;按照结构体类型的组成,系统为定义的结构体变量按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,续存储区域,结构体
5、变量结构体变量所占内存所占内存结构体中结构体中每个每个成员成员所占用内存的所占用内存的长度之和长度之和。struct studentnum4个字节个字节name20个字节个字节sex1个字节个字节age2个字节个字节addr30个字节个字节score4个字节个字节9.1.2 9.1.2 结构体变量结构体变量-(2)在定义类型的同时定义变量在定义类型的同时定义变量l语法格式语法格式:例如:例如:struct student char num8,name20,sex;int age;float score;st1,st2;struct 结构体名结构体名 成员定义表;成员定义表;变量名表;变量名表;
6、9.1.2 9.1.2 结构体变量结构体变量-(3)直接定义结构类型变量直接定义结构类型变量l语法格式语法格式:例如:例如:struct char num8,name20,sex;int age;float score;a,b,c;struct 成员定义表;成员定义表;变量名表;变量名表;在 struct 后不出现结构体名,因此也不能再以此定义相同的结构体变量。9.1.3 9.1.3 结构体变量的结构体变量的引用引用对于结构体变量,要通过成员运算符对于结构体变量,要通过成员运算符“.”“.”,逐个,逐个访问其成员,访问的格式为:访问其成员,访问的格式为:结构变量名结构变量名.成员成员 例如,s
7、truct student st1,st2;st1.num,引用结构变量st1中的num成员;st1.name 引用结构变量st1中的name成员,st2.name 引用结构变量st2中的name成员,也可以引用结构体变量以及变量成员的地址例如,&st1&st1.name其中的其中的“.”是是成员运算符成员运算符9.1.3 9.1.3 结构体变量的结构体变量的引用引用 如果某成员本身又是一个结构类型,则只能通过多如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。级的分量运算,对最低一级的成员进行引用。此时的引用格式扩展为:此时的引用格式扩展为:结构变量名结构变
8、量名.成员成员.子成员子成员.最低一级子成员最低一级子成员例如,例如,引用结构变量引用结构变量st1中的中的birthday成员的格式分别成员的格式分别为:为:st1.birthday.yearst1.birthday.monthst1.birthday.day9.1.4 9.1.4 结构体变量的结构体变量的初始化初始化【例】结构体变量的初始化【例】结构体变量的初始化 struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a=“0406011,Li
9、ming,M,1977,12,9,83,b=“0408025,Zhang liming,F,1978,5,10,87,c;如果初值个数少于结构体如果初值个数少于结构体成员个数成员个数,则将无初值对应的则将无初值对应的成员赋以成员赋以0值。值。如果初值个数多于结构体如果初值个数多于结构体成员个数,则编译出错。成员个数,则编译出错。9.5 9.5 共用体共用体 结构体类型解决了如何描述一个逻辑上相关,但数结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。据类型不同的一组分量的集合。在需要节省内存储空间时,在需要节省内存储空间时,c c语言还提供了一种由若语言还提供了一种由若干
10、个不同类型的数据项组成,但干个不同类型的数据项组成,但共享同一存储空间共享同一存储空间的构的构造类型。造类型。一种构造类型数据一种构造类型数据 共用体共用体由若干不同类型的数据项由若干不同类型的数据项(变量变量)占用占用 同一段内存空间的结构,同一段内存空间的结构,构成共用体的各个数据项称为构成共用体的各个数据项称为共用体成员共用体成员。9.5 9.5 共用体共用体 union 共用共用体名体名 数据类型数据类型1 成员名成员名1;数据类型数据类型2 成员名成员名2;数据类型数据类型n 成员名成员名n;共用体类型定义的一般形式:共用体类型定义的一般形式:lunionunion为关键字;为关键字
11、;l共用体名共用体名是用户定义的是用户定义的类型标识类型标识。l 中是组成该共用体中是组成该共用体的的成员成员。成员的。成员的数据类数据类型型可以是可以是C语言所允许语言所允许的任何数据类型的任何数据类型。9.5 9.5 共用体共用体-变量的定义变量的定义u1变量变量chu1变量变量iu1变量变量fl一一.利用已利用已定义的共用体类型名定定义的共用体类型名定义变量义变量 union 共用体名共用体名 变量名表;变量名表;例如:例如:union utype u1,u2;按照共用体类型的组成,系统为定义的共用体按照共用体类型的组成,系统为定义的共用体变量分配内存单元。变量分配内存单元。共用体变量共
12、用体变量所占内存所占内存共用体中占用内存的共用体中占用内存的长度最长的成员长度最长的成员。u1变量变量cc0c1c2c39.5 9.5 共用体共用体-变量的定义变量的定义l二二.在定义共用体类型的同时定义变量在定义共用体类型的同时定义变量例如:例如:union utype int i;char ch;float f;char c4;a,b,c;union 共用体名共用体名 成员定义表;成员定义表;变量名表;变量名表;9.5 9.5 共用体共用体-变量的定义变量的定义l三三.直接定义共用体类型变量直接定义共用体类型变量 例如:例如:union int i;char ch;float f;char
13、 c4;a,b,c;union 成员定义表;成员定义表;变量名表;变量名表;9.5 9.5 共用体共用体-变量的引用变量的引用l与结构变量一样只能逐个引用共用变量的与结构变量一样只能逐个引用共用变量的成员成员 scanf(“%d”,&a);printf(“%d”,a);l访问变量访问变量 a 各成员的格式为:各成员的格式为:a.i、a.ch、a.f等等 scanf(“d”,&a.i);printf(“%dn”,a.i);错误错误错误错误结构体与共用体的对比结构体与共用体的对比结构体与共用体的主要区别结构体与共用体的主要区别:(1 1)结构体变量结构体变量 占用空间是各成员所占空间之总和占用空间
14、是各成员所占空间之总和;共用体共用体变量变量 占存储空间是各成员中所占空间最大者。占存储空间是各成员中所占空间最大者。(2 2)结构体变量结构体变量 各成员占用内存中一片连续的存储区,各成员各成员占用内存中一片连续的存储区,各成员的地址互不相同;共的地址互不相同;共用体变量用体变量各成员在内存中所占空间的起始各成员在内存中所占空间的起始地址相同。地址相同。(3 3)结构体变量结构体变量的各个分量在任何时刻都同时存在,且可同时的各个分量在任何时刻都同时存在,且可同时引用。引用。共用体变量共用体变量的各个分量在同一时刻只存在其中一个,也的各个分量在同一时刻只存在其中一个,也只能引用其中的一个。只能
15、引用其中的一个。(4 4)结构体变量结构体变量可以初始化,可以初始化,共用体变量共用体变量不能初始化。不能初始化。9.7 9.7 用户自定义类型用户自定义类型为类型名定义别名的一般形式为类型名定义别名的一般形式:typedef 类型名类型名 新类型名新类型名或或 typedef 类型定义类型定义 新类型名新类型名 除可直接使用提供的标准类型和构除可直接使用提供的标准类型和构造类型(结构、共用、枚举)外,也可使造类型(结构、共用、枚举)外,也可使用用typedeftypedef定义已有类型的别名。该别名与定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。标准类型名一样,可用来定义
16、相应的变量。是关键字;是关键字;可以是可以是基本类型、构造类型、指针类基本类型、构造类型、指针类型或自定义类型名;型或自定义类型名;是自定义的类型名。是自定义的类型名。9.7 9.7 用户自定义类型用户自定义类型typedef int INTEGRER;/*定义定义INTEGRER为整型类型的别名为整型类型的别名*/typedef struct date int year;int month;int day;DATE;/*定义定义DATE为为struct date结构体类型名结构体类型名*/新类型名与旧类型名作用相同,并且可同时使用。新类型名与旧类型名作用相同,并且可同时使用。int i;与与 INTEGRER i;等价。等价。struct date birthday;与与 DATE birthday;等价。等价。