欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

联合体

程序员文章站 2022-07-12 23:11:08
...
#pragma pack(1) 
typedef union {     
struct {        
    struct         
          {            
            uint8_t  ch0_h:8;             //!< Byte 0 
            uint8_t  ch0_l:3;             //!< Byte 1             
            uint8_t  ch1_h:5; 
            uint8_t  ch1_l:6;             //!< Byte 2             
            uint8_t  ch2_h:2; 
            uint8_t  ch2_m:8;             //!< Byte 3 
            uint8_t  ch2_l:1;             //!< Byte 4            
            uint8_t  ch3_h:7; 
            uint8_t  ch3_l:4;             //!< Byte 5 
            uint8_t  s1:2;            
            uint8_t  s2:2;        
         }rc; 
 
    struct 
        {             
         int16_t x;                    //!< Byte 6-7    
         int16_t y;                    //!< Byte 8-9   
         int16_t z;                    //!< Byte 10-11      
         uint8_t press_l;              //!< Byte 12        
         uint8_t press_r;              //!< Byte 13       
       }mouse; 
        struct        
       {            
         uint16_t v;                   //!< Byte 14-15    
       }key; 
 
        uint16_t resv;                    //!< Byte 16-17    
      };    
      uint8_t buf[18];                      //!< Union --> Byte<0-17> 
}RC_Ctl_Define_t;

 

上面的就是联合体(又称共用体)的实际例子

①定义方法:typedef union{  } test;

②使用关键点:(1)可以看到      uint8_t buf[18]; 这个数组里面存了之前的结构体变量的值。他们共用一片内存地址。比如buf[0]的值等于ch0_h的值;

③使用好处:单片机的底层,如51某些时候需要按位与或,故  uint8_t  ch0_l:3;代表直接取高三位或者低三位,相当于省略了与的操作(高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端)