#include <iostream>
#include <cstdint>
union S
{
std::int32_t n; // 占用 4 字节
std::uint16_t s[2]; // 占用 4 字节
std::uint8_t c; // 占用 1 字节
}; // 整个联合体占用 4 字节
int main()
{
S s = { 1 }; // 初始化首个成员, s.n 现在是活跃成员
// 于此点,从 s.s 或 s.c 读取是未定义行为
std::cout << std::hex << "s.n = " << s.n << '\n';
std::cout << std::hex << "s.s = " << s.s << '\n';
std::cout << std::hex << "s.c = " << s.c << '\n';
s.s[0] = 0x0011; // s.s 现在是活跃成员
// 在此点,从 n 或 c 读取是 UB 但大多数编译器都对其定义
std::cout << "s.c is now " << +s.c << '\n' // 11 或 00 ,依赖平台
<< "s.n is now " << s.n << '\n'; // 12340011 或 00115678
getchar();
return 0;
}
共同操作一块内存,每个成员可以轮流活跃,比如,union表示工作类型时,用char【32】表示教师,用int表示学生,需要不同结果表示同一类型时,可以使用union。