共用体
1、概述与定义
什么是共用体:
共用体又称联合体,是不同数据类型的数据可以使用共同的存储区域。因此同一时间下,只能访问一个共用体的成员,因为它们的空间同一个地方的。
共用体的定义:
共用体的定义与使用与结构体的定义完全一致,唯一的区别是内存大小分配不同。
union 共用体名{
共用体成员
};
共用体变量的定义:
共用体变量的定义与结构体变量的第一完全一致。
//方法1:正常定义结构体变量
union 共用体名 共用体变量名;
//方法2:定义共用体时,定义共用体变量
union 共用体名{
共用体成员列表
}变量名1,变量名2; //直接在这里写变量名,变量名之间用,隔开
2、初始化共用体
一般情况初始化:
共用体中虽然成员有多个,但因为它们的空间一样,所以实际赋值是只需要赋值一个。
//1.定义共用体变量时初始化
union 共用体名 共用体变量名 = {一个值};
//2.定义共用体时,定义共用体变量的初始化
struct 共用体名{
共用体成员列表
}变量名 = {一个值};

初始化共用体中的结构体:
这时的初始化类似结构体变量的部分初始化,指定某一个变量,然后初始化。但同样的,只能初始化一个值。
union 共用体名 共用体变量名 = {
.成员 = 值
};

3、访问共用体变量
共用体变量的访问方法与结构体变量的访问方法完全一致。
访问共用体变量时,应该遵循赋值谁,就访问谁。尽管共用体成员的空间是一样的,强行访问也不会报错,但是逻辑上会有一些问题。

4、共用体大小
计算原则:
- 要能够容纳的下最大的数据
- 要是数据类型大小的整数倍,不是则需要补齐
举例:现在有一个共用体定义如下,计算它的大小。
union uTest{
double a;
int b;
char c;
char d[9];
}
在这个共用体中,所需空间最大的是d,空间为9字节。占用空间最大的类型是double,空间为8字节。因为9不能被8整除,所以补齐到16。因此该共用体的大小为16。

5、成员相同空间验证
5.1 空间覆盖问题
实验代码如下:
#include <stdio.h>
int main() {
union Data {
struct {
int x;
int y;
} s;
int x;
long long y;
} d;
d.x = 1;
printf("d.x :%x %x\n",&d.x,d.x);
printf("d.y :%x %llx\n",&d.y,d.y);
printf("d.s.x:%x %x\n",&d.s.x,d.s.x);
printf("d.s.y:%x %x\n",&d.s.y,*(&d.s.y));
puts("");
d.y = 0x12345678ffffffff;
printf("d.x :%x %x\n",&d.x,d.x);
printf("d.y :%x %llx\n",&d.y,d.y);
printf("d.s.x:%x %x\n",&d.s.x,d.s.x);
printf("d.s.y:%x %x\n",&d.s.y,*(&d.s.y));
return 0;
}
运行结果如下:

5.2 内存值相同,不是数字相同
实验代码如下:
#include <stdio.h>
int main() {
union dt {
int a;
char b;
double c;
} data;
data.a=5;
printf("%f\n",data.c);
return 0;
}
运行结果如下:

printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数。在内存中,实数与整数的存放形式完全不一样,共用体的成员共用的是同一块内存,而不是同一个数值
枚举
1、定义
枚举类型的定义与结构体一样。成员需要用" , "隔开
enum 枚举名{
枚举成员列表
};
在定义时,新的枚举的成员名不能与其他枚举的成员名有重复。

2、枚举的赋值与打印值
赋值枚举变量只能赋值枚举中列出的值。
枚举变量的打印值并不是枚举出来的值,而是从0开始的整型(在未进行初始化情况下)

如果枚举定义时,进行了指定值,那么实际值将会从指定值开始。

在赋值时,枚举的成员的赋值可以一样。

3、枚举大小
枚举的值实际上是一个整型,所以不论枚举成员有多少个,枚举大小都是4字节。

591

被折叠的 条评论
为什么被折叠?



