zoukankan      html  css  js  c++  java
  • C语言union(联合体、共用体)及应用

    C语言union(联合体、共用体)及应用  

    在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置。联合(union)变量的所有成员共享同片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。

    联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行。例如下面的描述定义了一个联合变量,并进行了初始化。

    1 uunion data
    2 {
    3     char n;
    4     float f;
    5 };
    6 union data u1 = {3}; //只有u1.n被初始化

    union的主要特征有: 

    union中可以定义多个成员,union的大小由最大的成员的大小决定;

    union成员共享同一块大小的内存,一次只能使用其中的一个成员; 
    对union某一个成员赋值,会覆盖其他成员的值(但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节);
    union量的存放顺序是所有成员都从低地址开始存放的

    因此,可以用联合(union)来判断CPU的大小端(印第安序):

     1 int checkCPU()
     2 {
     3     union w
     4     {
     5         int a;
     6         char b;
     7     }c;
     8     
     9     c.a = 1;
    10     
    11     return ( c.b == 1 );
    12 }

    同样的道理,在Linux中给出了更加精练的实现。如果宏ENDIANNESS='l'表示系统为little endian, 为‘b’表示big endian。

    1 static union
    2 {
    3     char c[4];
    4     unsigned long l;
    5 }endian_test = { {'l','?','?','b'} };
    6 
    7 #define ENDIANNESS ( (char)endian_test.l )
  • 相关阅读:
    StructureMap经典的IoC/DI容器
    移植的7zip到Vxworks 取名vx7zip
    试验Boost在Vxworks上的应用日记 三
    Log4cpp 崩溃
    试验Boost在Vxworks上的应用日记 一
    Vx7zip改进
    GoAhead 2.5 Web Server 网页ROM化的改进
    试验Boost在Vxworks上的应用日记 二
    原来CoreBluetooth 只支持Bluetooth Low Energy
    可变长结构体
  • 原文地址:https://www.cnblogs.com/merlindu/p/6417957.html
Copyright © 2011-2022 走看看