联合union简单测试例程:
#include<stdio.h>
union
{
int k;
struct
{
int x;
int y;
int z;
}u;
}a;
int main(void)
{
a.u.x=45;
a.u.y=67;
a.u.z=25;
a.k=0;
printf( "%d %d %d", a.u.x, a.u.y, a.u.z );
}
/*程序输出结果:0 67 25*/
/*
****************************
*在内存中的排列为生命的顺序x,y,z从低到高,然后赋值的时候,在内存中,
*就是x的位置放置45,y的位置放置67,z的位置放置25,现在对k赋值,对k的赋值因为是union,要共享内存,
*所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的值代替了,
*就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,67,25
****************************
*/
联合union在实际程序中的应用:
typedef union
{
unsigned char received_buf[100];//为联合类型分配允许的最大内存
struct//定义结构体1
{
unsigned short int head; //占2个字节 buf[0] buf[1]
unsigned short int len; //占2个字节 buf[2] buf[3]
unsigned char com; //占1个字节 buf[4]
unsigned char id;
unsigned char cnt;
unsigned char age;
unsigned char change;
unsigned char version;
unsigned char num1;
unsigned char d1;
unsigned char nc;
unsigned char check;
}data1;
struct//定义结构体2
{
unsigned short int head; //占2个字节 buf[0] buf[1]
unsigned short int len; //占2个字节 buf[2] buf[3]
unsigned char com; //占1个字节 buf[4]
unsigned char id;
unsigned char cnt;
unsigned char years;
unsigned char months;
unsigned char data;
unsigned char hours;
unsigned char minutes;
unsigned char second;
unsigned char result; //占1个字节 buf[13]
unsigned char nc;
unsigned char check;
}data2;
}Rc_Buf;Rc_Buf rc_buf;
这里为union类型Rc_Buf 分配的字节大小是:unsigned char received_buf[100]即100个字节。此时可以把Rc_Buf定义类型的变量看成一个数组,只是数组中的前面N个元素引用是并不是用下标引用(当然也可以使用下标引用),而是通过引用结构中的名字来引用
结构体1和结构体2都占用这100个字节,只是在同一时刻只有一个结构体占用这100个字节。
例如:
如果是结构体1占用这100个字节 如果rc_buf[4]=8,那么结构体1的结构成员com的值就是8(注意这里的字节对齐)
如果是结构体2占用这100个字节 如果rc_buf[13]=5,那么结构体2的结构成员result的值就是5(注意这里的字节对齐)
其实就是给received_buf[100]这个数组的各个元素起了一个别名,在引用的时候方便引用,而不用使用下标引用(太繁琐,也不方便操作)。