我读了这个链接what-is-the-point-behind-unions-in-c 但这个答案对我来说看起来不够。
我可以对工会的使用有更多解释吗? 我不想要任何与内存相关的示例,这将占用最多4个字节(浮点占用4个字节)。
union un{
char ch;
int iNum;
float fNum;
};
所以我的问题是,
究竟使用了什么联盟?
为什么我们需要这个?
请帮助我,让我感到困惑。 感谢。
答案 0 :(得分:3)
联盟最常见的两个用途可能是:
要实现自己的Variant type,union
使您能够代表所有不同的类型,而不会浪费内存。 This answer给出了一个很好的例子。
Type punning但我也会阅读Understanding Strict Aliasing,因为很多情况type punning
都是undefined behavior。虽然在实践中大多数编译器都支持通过联合打字。
答案 1 :(得分:1)
如果您有一个 一个char
,或一个int
,或 ...
它通常用在包含实际联合类型的结构中。解析器经常使用它从词法分析器返回一个令牌。类似的东西:
struct token
{
int token_type;
union
{
char *s; /* For string or keyword tokens */
double f; /* For floating point tokens */
long i; /* For integer tokens */
} token_value;
};
在上述结构中,token_value
成员中使用的成员取决于token_type
成员。
也可以通过滥用联合中的数据来使用联合,其中您设置变量的一个成员并读取另一个变量。例如,这可以用于将浮点数转换为一系列字节。
像
union data
{
char data[sizeof(double)];
double value;
};
通过设置value
成员,您可以读取double
值的单独字节,而无需进行类型转换或指针算法。这是技术上实现定义的行为,这意味着编译器可能不允许它。它是非常常用的,因此所有当前的编译器都允许它。