结构struct 联合Union和枚举Enum的细节讨论

联合(Union)
是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换。联合体对象在同一时间只能存储一个成员的值。
联合的内存大小取决于其中字节数最多的成员,而不是累加,联合也会进行字长对齐。 在定义联合变量的时候可以指定初始值,但是只能制定一个初始值 (测试过似乎无法设置初值) ,而且该初始值的类型必须与联合的第一个成员的类型匹配。 可以取一个联合变量的地址,也可以取变量中的任一个成员的地址,它们总是相等的。 可以在同类型的联合变量之间赋值,但是不能比较两个联合变量的大小,不只是因为可能存在填补字节的问题,而且这两个变量可能是不同类型的成员,因此代表了两个类型不同的变量。

有这么几种定义联合体的方法:

1)标准方法

union a
{
    
int  b;
    
char  c;
};
a abc;
abc.b
= 4 ;
abc.c
= 5 ;
// 或者也可以直接在定义时定义变量
union a
{
    
int  b;
    
char  c;
}abc;
abc.b
= 4 ;
abc.c
= 5 ;

 2)使用typedef。这样相当于重新定义一个自定义类型,a作为类型名称。而不是如上面的变量名称。

typedef union
{
    
int  b;
    
char  c;
}a;
a abc;
abc.b
= 4 ;
abc.c
= 5 ;

 3)不定义类型而只定义实例名称。这种方法用来局部使用union,而已在指定的某个作用域下使用。此时abc只是变量名称,而不是类型名称。

union
{
    
int  b;
    
char  c;
}abc;
abc.b
= 5 ;
abc.c
= 6 ;

  4)匿名联合体(anonymous union ),这种联合体比较特殊,它既不定义类型名称,也不定义变量名称。这种联合体只能作用在struct内部,相当于结构的一个成员。

struct  a
{
    
int  b;
    union
    {
        
int  c;
        
char  d;
    };
};
a abc;
abc.b
= 5 ;
abc.c
= 6 ;
abc.d
= 7 ;

  这里有一种利用联合体来判断平台属性的简单程序,可以快速地判断平台是大端还是小端模式。如果函数返回0则表示平台是大端模式,否则是小端模式。

 1 int  CheckCPU( void )
 2 {
 3     union w
 4      {
 5          int  a;
 6          char  b;
 7     }
c;
 8     c.a  =   1 ;
 9      return (c.b == 1 );
10 }
 
结构(struct)
结构体的使用比较多,使用的方法和union类似,可以标准定义,可以用typedef定义别名。一般会采用typedef这样较规范的方法来定义结构体。也可以不定义类型名,只定义一个局部结构变量,从而使得该结构只在小范围内使用。
另外结构也有 匿名结构(anonymous struct) 的定义方法,但使用范围不广,C++并不支持匿名结构。它的使用正和union相反,必须放在union体内部才能使用。
union U {
  
struct  {
    
int  a;
    
double  b;
  };
  
struct  {
    
char *  c;
    unsigned d;
  };
};


枚举(Enum)
定义的一组特殊用途的符号常量,它表示这种类型的变量可以取值的范围。
定义枚举类型的时候,如果不特别指定其中的标示符的值,则第一个标示符的值将是0,后面的比前面的依次大1。如果指定了某一个标示符的值,后面的再前面的基础上依次大1。如
      enum Week{Sun, Mon=125, Tue, Wed, Thu=140, Fri, Sat};
其中的符号常量的值依次为:0, 125, 126, 127, 140, 141, 142。
也可以把某些枚举常量初始化为相等的常量,如
      enum ABC{A=1, B=1, C=100};
另外,枚举类型还可以是匿名的,即匿名枚举anonymous enum )。匿名的枚举类型就相当于直接定义的const符号常量,可以作为全局枚举,也可以放在任何类定义或名字空间中。
      enum
      {
            OBJECT_CREATIONG      =0x10;
            OBJECT_DELETIONG      =0x11;
            STATE_CHANGE              =0x12;
            ATTR_VALUE_CHANGE    =0x13;
      };
它可以取代宏常量和const符号常量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值