
第16章 共用体.ppt
19页第16章 共用体,共用体又称为联合体,它和结构体一样也是一种由用户自己定义的数据类型,它也由若干个成员数据组成其成员的数据类型可以是相同的,也可以是不同的共用体类型定义共用体类型变量、数组和指针变量的定义共用体类型变量、数组和指针变量的引用共用体应用举例用typedef定义数据类型,16.1 共用体类型定义,由于不同的共用体可以不有同的成员,因此共用体也需要用户在程序中根据自己的需要自己定义定义共用体之后,就可以使用这种数据类型16.1.1 定义共用体,所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元由于不同的的共用体类型的数据可以有不同的成员,因此共用体也是需要用户在程序中自己定义的一种数据类型共用体的定义格式如下:union 共用体名{数据类型1 成员1名;数据类型2 成员2名;…数据类型n 成员n名;};,16.1.2 共用体的存储,从共用体的定义中可以看出,共用体数据类型与结构体在形式上非常相似,但两者有本质上的不同在结构体中各成员有各自的内存空间,一个结构体变量的总长度是各成员长度之和而共用体中,各成员共享一段内存空间,一个共用体变量的长度等于各成员中最长的长度。
union data /*共用体*/{ int a; float b; double c; char d;};,对于共用体,作以下几点说明:(1)共用体只有定义了该共用型的变量、数组或指针变量后,才会给该变量、数组和指针变量分配内存2)同一个内存可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时存在和起作用3)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用4)共用体变量的地址和它的各成员的地址都是同一地址5)不能对共用体变量名赋值,不能企图引用变量名来得到一个值,也不能在定义共用体变量时对它初始化6)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组反之,结构体也可以出现在共用体类型定义中,数组成可以作为共用体的成员16.2 共用体类型变量、数组和指针变量的定义,定义了共用体之后,就可以用这种数据类型来定义相应的变量、数组以及指针变量等共用体变量、数组和指针变量的定义和一般的变量、数组和指针变量的定义方法相同,惟一需要注意的是“数据类型符”必须是用户自己定义的公用体,即“union 共用体名”。
共用体变量、数组和指针变量的定义与结构体变量、数组及指针变量的定义方法相同分为三种:第一种是先定义共用体,再定义共用体变量、数组及指针变量;第二种是定义共用体的同时定义共用体变量、数组及指针变量;第三种是定义共用体的同时定义共用体变量、数组及指针变量,但省略共用体名16.2.1 先定义共用体,再定义共用体变量、数组及指针变量,其定义格式如下:union 共用体名{数据类型1 成员1名;数据类型2 成员2名;…数据类型n 成员n名;};…union 共用体名 变量名,共用体数组名[数组长度],*共用体指针变量名;,16.2.2 定义共用体的同时定义共用体变量、数组及指针变量,这种方式的定义如下:union 共用体名{数据类型1 成员1名;数据类型2 成员2名;……数据类型n 成员n名;}变量名,共用体数组名[数组长度],*共用体指针变量名;,16.2.3 定义共用体变量、数组及指针变量时省略共用体名,这种格式其实跟第二种格式相似,只是把共用体名省略掉了格式如下:union{数据类型1 成员1名;数据类型2 成员2名;…数据类型n 成员n名;}变量名,共用体数组名[数组长度],*共用体指针变量名;,16.3 共用体类型变量、数组和指针变量的引用,union{int classno;char address[20];}a,b[5],*p;(1)用共用体变量引用其成员,引用格式如下:共用体变量名.成员名例如:a.classno (2)用共用体数组元素来引用其成员,引用格式如下:共用体数组名[下标].成员名例如:b[0].classno,(3)共用体指针变量引用该共用体的变量或数组,格式如下:共用体指针变量=&共用体变量名共用体指针变量=&共用体数组名[下标]共用体指针变量=共用体数组名(4)使用共用体指针变量引用共用体的成员,引用格式如下:(*共用型指针变量).成员名共用型指针变量->成员名,16.4 共用体应用举例,【例16-6】设有若干个成员的数据,其中有教师和学生。
学生的数据包括号码、姓名、性别、职业、班级教师数据包括号码、姓名、职业、职务教师和学生的数据是不同的,现要求把它们放在同一张表格中,如表16-1所示 要求输入人员的数据,然后再输出16.5 枚举类型,在实际问题中, 有些变量的取值被限定在一个有限的范围内例如,一个星期内只有七天,一年只有十二个月, 一个班每周有六门课程等等如果把这些量说明为整型, 字符型或其它类型显然是不妥当的 为此,C语言提供了一种称为“枚举”的类型16.6 枚举类型的定义,枚举的定义枚举类型定义的一般形式为: enum 枚举名 { 枚举值表 }; 例如:enum weekday { sun,mou,tue,wed,thu,fri,sat };,对于枚举类型需要说明以下几点:(1)定义的枚举类型用“enum标识符”标识枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增2)在定义枚举类型时,程序员可在枚举数据时通过“=”号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增 (3)枚举变量的定义与结构体和联合体一样,枚举变量也可用不同的定义方式,即先定义枚举类型再定义变量、定义枚举类型的同时定义变量或直接定义变量。
16.7 枚举类型变量的赋值和引用,枚举类型变量在定义以后,要使用这些枚举类型变量,以使其具有一定的值枚举类型变量的赋值和引用需要注意以下几点:(1)枚举值是常量,不是变量不能在程序中用赋值语句再对它赋值2)枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…3)只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量16.8 用typedef定义数据类型,自定义数据类型符的语法格式为:typedef 类型符1 类型符2;1.用typedef定义基本数据类型typedef 基本数据类型符 用户自定义数据类型符;2.用typedef定义数组类型typedef 数据类型符 用户自定义数组类型符[数组长度];3.用typedef定义指针类型typedef 数据类型符 *用户自定义指针类型符;,用typedef定义结构体的格式如下:typedef struct{ 数据类型1 成员名1; 数据类型2 成员名2; … 数据类型n 成员名n;}用户自定义结构类型符;,对于typedef自定义数据类型需要做以下几点说明:(1)用typedef自定义数据类型,只是对已有的数据类型加一个类型名,并没有产生新的数据类型。
如:typedef int INTEGER;INTEGER a;(2)用typedef可以定义各种数据类型名,但不能定义变量用typedef定义的是数据类型的别名,可以用这个别名去定义相应的变量3)有时可以使用宏定义来代替typedef的功能,但事实上,二者是不同的宏定义只是简单的字符串替换,是在预编译的时候处理完成的;而typedef是在编译的时候完成的,其更为灵活。
