C语言--union联合

联合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]这个数组的各个元素起了一个别名,在引用的时候方便引用,而不用使用下标引用(太繁琐,也不方便操作)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值