40、共用体和枚举简介C 语言 2009-11-25 16:14:40 阅读86 评论0 字号:大中小
一、定义格式
1、共用体
共用体由若干个数据类型组合而成。和结构体型不同的是,共用体数据中所有成员都占用相同的内存单元,设置这种数据类型的主要目的就是节省内存空间。
union 共用体名
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
}共用体变量名;
例如
union data
{
int i;
char ch;
float f;
}a,b,c;
union
{
int i;
char ch;
float f;
}a,b,c;
union data
{
int i;
char ch;
float f;
};
union data a,b,c;
2、枚举
1)枚举型定义的一般形式为:
enum 枚举名 { 枚举常量1,枚举常量2,…,枚举常量n };
其中的枚举常量是用户给常量取的标识符,有固定的值,在一个含有n个枚举常量的枚举型中,C语言规定枚举常量的值按枚举的顺序分别依次等于0、1、…、 n-1。如
(1)先定义枚举型,再定义枚举变量。
enum 枚举名 变量名表;
enum traffic{ train,plane,car,ship };
enum traffic trone,trtwo;
(2)在说明枚举型的同时定义枚举型的变量。
enum traffic{train,plane,car,ship}trone,trtwo;
(3)不说明枚举型,直接定义枚举变量。
enum { train,plane,car,ship}trone,trtwo;
2)赋初值
枚举常量赋初值的方法是在枚举常量的后面跟上“=整型常量”。
例如,下面是一个表示三原色的枚举型:
enum color{red=3,yellow=5,blue=8};
此时,枚举常量red的值为3,yellow的值为5,blue的值为8。
在给枚举常量赋初值时,如果给其中任何一个枚举常量赋初值,则后面的枚举常量将按自然数的规则依次赋初值,例如:
enum weekday{ sun,mon,tue,wed=6,thu,fri,sat };
上面的例子只给枚举常量wed赋了初值,在这种情况下,每个枚举常量的初值分别如下:sun的值为0,mon的值为1,tue的值为2,wed的值为6,thu的值为7,fri值为8,sat值为9。
二、共用体内存存储情况
结构体变量所占的内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。
1)共用一段内存,可以用来存放几种不同类型的成员,但每一瞬时只有一个成员起作用。
2)共用体变量中前一次起作用的成员在存入新的成员后原有的成员失去意义。
3)共用体变量和它的所有成员的地址都是同一地址。
unoin sr
{
char ch1;
float a;
};
union sr str; /*定义共用体变量str*/
此时,&str、&str.ch1、&str.a的地址值是同一个。
4)不能对共用体变量名赋值,也不能在定义共用体变量时对它进行初始化。
5)共用体类型中可以有结构体变量作为其成员,结构体类型中也可以有共用体变量作为其成员。
6)不能对共用体变量名赋值,也不能通过引用变量名得到一个值。
为了节省空间,假如现在只给三个成员一共分配4个内存单元,那么3个成员之间的对应关系
三、共用体引用
(1)直接引用
共用体变量成员的直接引用是通过运算符“.”实现的。其引用的一般格式为:
共用体变量名.成员名
(2)通过指向共用体变量的指针进行引用
通过指向共用体变量的指针可以对共用体变量的成员进行存取操作。其一般的语法格式为:
指向结构体变量的指针->成员名 或
(*指向结构体变量的指针).成员名
指向共用体变量的指针对共用体变量的操作可以通过强制转换后的指针存取共用体变量的成员,而不必指定成员名。系统会根据强制转换的数据类型给与该类型相同的数据成员赋值。如:
union worker /*定义共用体*/
{ float salary;
int number;
};
*(float*)p=4567.0;
(3)共用体变量与函数
共用体变量本身不能作为函数的参数,但共用体成员可以在函数中进行引用。而且函数也不能返回共用体变量。但是指向共用体变量的指针可以作为函数的参数,返回值也可以是指向共用体变量的指针。
四、注意点
1、共用体不能作为函数参数或函数值,但可以使用指向共用体的指针变量。
2、枚举值是常量,不是变量。
3、可以把枚举值赋予枚举变量,但是,却不能把元素的数值直接赋予枚举变量。例如,x=sum; y=mon; 表示是正确的。而x=0;y=4;表示是错误的。
如果一定要把数值赋予枚举变量,则必须用强制类型转换。即用强制类型转换可以将数值赋予枚举变量。枚举元素不是字符型常量也不是字符串常量,使用时不要加单引号或双引号。