联合体中的所有成员共用一块内存区域,这个区域的长度取决于占用空间最长的成员
看代码效果,比较直观
/* * arr 和 addr共用一块空间,空间长度为32bit * 如果arr类型是uint16_t,那么此空间长度就是16*4=64(bit) */ struct addr { union { uint32_t addr; uint8_t arr[4]; }; }; /** * union中的struct和addr共用一块空间,struct用__packed对齐修饰,长度为8bit * struct中成员a,b,..每个占用1bit,8个打包成一个就是8bit(1byte)长度 */ struct flash { union { struct { unsigned char a:1; unsigned char b:1; unsigned char c:1; unsigned char d:1; unsigned char e:1; unsigned char f:1; unsigned char g:1; unsigned char h:1; } __attribute__((packed)); uint8_t addr; }; }; int main() { struct addr x; struct flash z; z.addr = 0x77;//01110111 (8bit) x.addr = 0x12345678;// (32bit) printf("%d%d%d%d%d%d%d%d", z.a, z.b, z.c, z.d, z.e, z.f, z.g, z.h); //打印出每个bit位成员的值,结果:11101110, z.a为低位,z.h为高位 printf("xxxx", x.arr[0], x.arr[1], x.arr[2], x.arr[3]); //打印数组值x.arr[0]为低位,x.arr[3]为高位,结果:78563412 return 0; }刚好利用此特性解决了代码的冗余,比如每次读写32位寄存器,32位地址要用数组的方式传进去,此时就可直接一次赋值32bit位(x.addr = 0x12345678),然后用联合体取到每个byte的值(x.arr[2] = 0x34)
以上.