有时想用同一段内存单元存放不同类型的变量。例如,把一个短整型变量,一个字符型变量和一个实型变量放在同一个地址开始的内存单元中 1000地址。以上3个变量在内存中占的字节数不同,但都从同一地址开始(图中设地址为1000)存放,也就是使用覆益技术,后一个数据覆益了前面的数据。这种使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。
定义方式和结构体类似
typedef union stu
{
char a;
int b;
float c;
}STU;
int main()
{
STU test;
test.b = 97;
printf("%d\n", sizeof(test));
printf("%c\n", test.a);
printf("%d\n", test.b);
printf("%f\n", test.c);
}
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的存单元。
而共用体变量所占的内存长度等于最长的成员的长度。
1、同一内存段可以存放集中不同类型的成员,但每一瞬间只能由一种起作用
2、共用体变量中起作用的成员是最后一次存放的成员。在存入一个新成员后原有的成员的值会被覆盖
3、共用体变量的地址和他的各个成员的地址都是同一地址
4、共用体变量的初始化
union Data
{
int i;
char ch;
float f;
};
int main()
{
union Data a = { 16 };//对第一个变量赋值
union Data b = { .ch = 'A' };//对第二个变量赋值
printf("%d\n", a.i);//16
printf("%c\n", b.ch);//A
}
5、不能对共用体变量名赋值,同类型的共用体变量可以互相赋值。
枚举类型就是指把可能的值一 一列举出来,变量的值只限于列举出来的值的范围内。
enum 枚举类型名{
枚举值列表
}
enum Color {
red,blue,green,black,white
};
int main()
{
enum Color sky = blue;//真确,blue是定义中的值
enum Color sky = a;//错误
}
注意:
1、C编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识
符(有名字)而把它们看作变量,不能对它们赋值。例如:
blue = 1;
2、每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5…。
enum Color {
red, blue, green, black, white
};
int main()
{
printf("%d\n", red);//0
printf("%d\n", blue);//1
printf("%d\n", green);//2
printf("%d\n", black);//3
printf("%d\n", white);//4
}
也可以人为地指定枚举元素的数值,在定义枚举类型时显式地指定,例如;
enum Color {
red = 4, blue = 4, green = 2, black = 1, white = 7
};
int main()
{
printf("%d\n", red);//4
printf("%d\n", blue);//4
printf("%d\n", green);//2
printf("%d\n", black);//1
printf("%d\n", white);//7
}
3、枚举元素可以用来作判断比较。例如;
enum Color {
red = 4, blue = 4, green = 2, black = 1, white = 7
};
int main()
{
enum Color sky = blue;
if (sky == blue) {
printf("%s", "sky is blue");
}
if(sky > red){
}
}