可能是重复问题:
C语言中结构体和联合体的区别
代码如下:
union time
{
long simpleDate;
double perciseDate;
} mytime;
在C语言中,联合体和结构体有什么区别?你会在哪里使用联合体,它有什么好处?Java、C++或Python中是否有类似的结构?
可能是重复问题:
C语言中结构体和联合体的区别
代码如下:
union time
{
long simpleDate;
double perciseDate;
} mytime;
在C语言中,联合体和结构体有什么区别?你会在哪里使用联合体,它有什么好处?Java、C++或Python中是否有类似的结构?
一个联合体在内存中的行为就像所有成员都在同一位置上,彼此重叠。
当你想要表示某种“通用”值或可以是一组类型中的任何一种类型的值时,这是非常有用的。由于字段重叠,只有在知道先前已初始化了哪个字段时,才能合法地访问字段。尽管如此,由于 C 不会检查这一点,许多编译器会生成允许这样做的代码,因此这是一种常见的技巧,例如:
union {
int integer;
float real;
} convert;
convert.real = 3.14;
printf("The float %f interpreted as an integer is %08x", convert.real, convert.integer);
如果您更加注重代码的规范性,需要跟踪联合类型中最后存储的内容,可以像下面这样实现:
typedef enum { INTEGER = 0, REAL, BOOLEAN, STRING } ValueType;
typedef struct {
ValueType type;
union {
int integer;
float real;
char boolean;
char *string;
} x;
} Value;
需要注意的是,这里的联合实际上是包围结构体 Value
中的一个字段。访问可能看起来像这样:
void value_set_integer(Value *value, int x)
{
value->type = INTEGER;
value->x.integer = x;
}
这个记录表明联合体的当前内容是一个整数,并存储给定的值。例如,用于打印Value
的函数可以检查type
成员,并执行正确的操作:
void value_print(const Value *value)
{
switch(value->type)
{
case INTEGER:
printf("%d\n", value->x.integer);
break;
case REAL:
printf("%g\n", value->x.real);
break;
/* ... and so on ... */
}
}
Java中没有相应的功能。C++几乎是C的超集,具有相同的功能。它甚至比C的实现更胜一筹,并允许使用匿名联合。在C++中,上述代码可以不命名内部联合(x
)而写成,这会使代码变得更短。
所以在你的例子中,当我分配时间时:
int main()
{
time t;
}
t.simpleDate;
或者好像它是一个双精度浮点数:
t.perciseDate;
因此,如果t处的内存原始十六进制值如下:
0x12345678;
struct Msg
{
int msgType;
double Val1;
double Val2;
}; // assuming packing on 32-bit boundary
union
{
Msg msg;
unsigned char msgAsBinary[20];
};
联合体(Union)让你以多种方式解释一个内存位置(原始的,二进制值)。
我曾经使用过一个例子,就是访问 uint32 的各个字节。
union {
uint32 int;
char bytes[4];
} uint_bytes;
联合体(union)提供了多种访问同一内存的方式。
联合体类型的大小等于联合体中最大类型的大小。
联合体可以用来存储其任意一个成员,但是(与结构体不同)不能同时存储多个成员。您可以将其视为包含足够的空间以存储其最大的成员,并且重复使用相同的存储空间,用于实际分配值的任何成员。
C++也有联合体。Java没有。Python中的对象成员与C完全不同,它们存储在字典中而不是按顺序在内存中排列。我不知道Python是否有一些方便的库类,可以像C中那样充当联合体,但它不像在C中那样是对象的基本组成部分。
使用结构体时,每个数据项都有自己的内存位置,但是使用联合时,一次只使用一个数据项,并且为每个数据项分配的内存位于共享内存中。联合的数据项只会共享一个内存位置。联合的大小将是最大变量的大小。
这可能是有益的,因为有时我们可能不需要复杂数据结构中所有(相关)数据项的数据,并且仅存储/访问一个数据项。在这种情况下,联合有助于解决问题。
联合体只能同时使用一个成员,而结构体中所有成员都驻留在内存中。对于联合体,分配的空间大小为其包含的最长元素的大小。