Vin*_*nay 21 c c++ struct unions
可能重复:
C中结构和联合之间的差异
我能理解结构意味着什么.但是,我对union和struct之间的区别感到困惑.联盟就像是记忆的一部分.究竟是什么意思.
Cha*_*via 24
通过联合,所有成员共享相同的内存.使用结构,它们不共享内存,因此内存中的不同空间被分配给结构的每个成员.
例如:
union foo
{
int x;
int y;
};
foo f;
f.x = 10;
printf("%d\n", f.y);
Run Code Online (Sandbox Code Playgroud)
在这里,我们将值10分配给foo::x.然后我们输出值foo::y,也是 10,因为x和y共享相同的内存.请注意,由于联合的所有成员共享相同的内存,因此编译器必须分配足够的内存以适合联合的最大成员.所以包含a char和a 的联合long需要足够的空间来适应long.
但是如果我们使用结构:
struct foo
{
int x;
int y;
};
foo f;
f.x = 10;
f.y = 20;
printf("%d %d\n", f.x, f.y);
Run Code Online (Sandbox Code Playgroud)
我们将10分配给x,将20分配给y,然后将它们打印出来.我们看到x是10而y是20,因为x和y不共享相同的内存.
编辑:还要注意上面的Gman的评论.我提供的联盟示例仅用于演示目的.实际上,您不应该写入联合的一个数据成员,然后访问另一个数据成员.通常这只会导致编译器将位模式解释为另一种类型,但是您可能会得到意外的结果,因为这样做是未定义的行为.
Sam*_*Sam 10
我已经使用联合将字节转换为其他类型的字节.我发现它比位移更容易.
union intConverter {
int intValue;
struct {
byte hi;
byte lo;
} byteValue;
}
intConverter cv;
cv.intValue =1100;
printf("%X %X\n", cv.byteValue.hi, cv.byteValue.lo);
Run Code Online (Sandbox Code Playgroud)
其中int是16位(用于微控制器).
联合体的每个成员共享相同的内存。这意味着,如果你改变其中之一,你就会改变其他人。如果成员属于不同类型,这可能会产生不可预测的结果。(并不完全不可预测,但很难预测,除非您了解构成数据成员的底层位模式)。