我认为你误解了工会。
使用联合背后的想法是节省内存......
是的,这是一个原因
...并获得与结构等效的结果...
不
它不等价。它们在源代码中看起来很相似,但它是完全不同的东西。像苹果和飞机。
联合是一个非常非常低级的结构,它允许您查看一块内存,就像存储它的任何“成员”一样,但您一次只能使用一个。甚至使用“成员”这个词也极具误导性。它们应该被称为“视图”或其他东西,而不是成员。
当你写:
union ABCunion
{
int a;
double b;
char c;
} myAbc;
你是说:“取一块足够大的内存来容纳 int、char 和 double 中最大的内存,我们称之为myAbc。
在该内存中,现在您可以存储int、double或char。如果你存储一个 int,然后存储一个 double,这个 int 就永远消失了。
那有什么意义呢?
联合有两个主要用途。
a) 区分存储
这就是我们上面所做的。我选择一段记忆,并根据上下文赋予它不同的含义。有时上下文是显式的(您保留一些变量来指示您存储的变量的“种类”),有时它可能是隐式的(根据代码部分,您可以判断必须使用哪个变量)。无论哪种方式,代码都需要能够弄清楚,否则您将无法对变量执行任何明智的操作。
一个典型的(显式)示例是:
struct MyVariantType
{
int typeIndicator ; // type=1 -> It's an int,
// type=2 -> It's a double,
// type=3 -> It's a char
ABCunion body;
};
例如,VB6 的“变体”是与上述不同的联合(但更复杂)。
b) 拆分表示 当您需要能够将变量视为“整体”或部分组合时,这有时很有用。用一个例子更容易解释:
union DOUBLEBYTE
{
struct
{
unsigned char a;
unsigned char b;
} bytes;
short Integer;
} myVar;
这是一个带有一对字节的短整数“联合”。现在,您可以查看与短整数 (myVar.Integer) 相同的值,也可以轻松研究构成该值一部分的各个字节(myVar.bytes.a 和 myVar.bytes.b)。
请注意,第二次使用是不可移植的(我很确定);这意味着它不能保证在不同的机器架构上工作;但是这种使用对于 C 设计的任务类型(操作系统实现)是绝对必要的。