现在的位置: 首页 > 综合 > 正文

联合体

2013年10月23日 ⁄ 综合 ⁄ 共 934字 ⁄ 字号 评论关闭

结构与联合有和区别?

答:

(1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 
(2). 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的

联合体在对允许位操作的寄存器进行访问时很有优势。

比如定义如下的联合体:

typedef union 
{
  struct  
  {
    unsigned dp   :1 ;  //page,dp占1个位(第一字节的第0位)    unsigned == unsigned int
    unsigned edp  :1 ;  //null  edp占1个位(第一字节的第1位)
    unsigned p    :3 ;  //优先级 p占3个位(第一字节的第2-4位)
    unsigned re   :3 ;  //null  re占3个位(第一字节的第5-7位)
    unsigned char pf     ;  //pgn格式 pf占1个字节(第一字节的第8位)
    unsigned char ps     ;  //PDU1的目标地址,或者PDU2的附加PF格式   ps占1个字节
    unsigned char sa     ;  //来源地址      sa占1个字节
  }IdFormat;
  unsigned long IdValue;
} ID1939;
引用:
typedef struct 
{                           
  ID1939 framID;            //ID
  unsigned char data[8];    //数据域
} Frame1939;

再举例:

比如我想要定义一个int型变量(32位环境),对于这个变量,我需要对每一位进行位操作与读取,可以这样实现:

union bit32

{

int whole;

struct 

{

usigned int bit0:1;

usigned int bit1:1;

      ........

     usigned int bit31:1;

}byte;

}bittest;

对某个位进行赋值,如 bittest.byte.bit0=1, bittest.byte.bit3=1;

对32个bit组成的int型变量进行整体查看:printf("%d\n",bittest.whole);

抱歉!评论已关闭.