C语言-联合(union)

  在c语言中,学会使用联合(union)来进行程序设计是一个很重要的技能,同时,在阅读许多优秀源码时,也会看见联合的身影。于是乎,寻求了许多资料 ,将其一些相关知识总结在下面了。

 

  一、什么是联合(union)?

    联合(union)是一种数据类型,特点是:  

  (1)能在同一个存储空间中储存不同的数据类型(注意不是同时存储)

  (2)联合只能储存一个值,这一点与结构是不同的。

  (3)在联合中,一次只储存一个值,即使有足够的空间,也不能同时储存多个值。例如同时存储一个char类型值和一个int类型的值。所以说,在设计编写程序时,就需要明确注意当前储存在联合中的数据类型。

   (4)编译器需分配足够的空间以便能储存联合声明中占用最大字节的类型。

  二、联合的使用和一些技巧总结

  (1)创建联合方法

     ——联合模板+联合变量;

 1 //创建(声明)联合模板car
 2 union car
 3 {
 4     char     car_name;
 5     double  car_speed;
 6     int      car_num;
 7     
 8 };
 9 
10 //定义三个与car相关的联合变量
11 union car MaxCar;                                      //car类型的联合变量
12 union car Car_array[40];                  //内含40个联合变量的数组
13 union car *ptcar;                      //指向car类型联合变量的指针

 

  

  说明:创建联合和创建结构的方式相同。若按照如上的代码形式声明的结构可以存储一个char类型、一个double类型和int类型的值。但是声明的联合只能储存一个char类型的值或一个double类型的值或int类型的值。

 

  (2)初始化联合

  有三种方法初始化联合:

    1、把一个联合初始化为另一个同类型的联合

    2、初始化联合的第一个成员

    3、使用指定初始化器(C99标准)

  如下 代码:

 

1 union car first_car;
2 first_car.car_name='A';
3 union car sec_car=first_car;          //把一个联合初始化为另一个同类型的联合
4 
5 union car car_a={'B'};         //初始化联合的第一个成员
6 
7 union car car_b={.car_num=2};     //使用指定初始化器来初始化联合car_b

 

  (3)使用联合

  1、使用方法(一)

    用一个成员把值储存在联合中,然后用另一个成员查看内容。

 

  2、使用方法(二)(该方法参考于《c Primer Plus》)

    可以将联合与结构一起来使用,在结构中储存与其成员有从属关系的信息

 

//声明owner结构
struct owner_car
{
    int    car_num;
    char   car_name;
};

//声明rent_car结构
struct rent_car
{
    double car_price;
    int    car_type;
};

//声明car_info联合
union car_info
{
    struct owner_car OwnerCar;
    struct rent_car  RentCar;
};

//声明car_data结构
struct car_data
{
    int carID;
    int status;          //0——私有,1——租车
    union car_info CarInfo;
};

 

 

 

  说明:如上代码中,若FirstCar是car_data结构类型的变量,如果FirstCar.status=0,程序将使用FirstCar.CarInfo.OwnerCar.car_num;如果FirstCar.status=1,程序将使用FirstCar.CarInfo.RentCar.car_price(注:这段是一种设想情况)

  总结:通过该种方法可以对数据进行选择性组织,从而可以构建出一种很有用的数据模型。

 

 

 

   

原文地址:https://www.cnblogs.com/iriczhao/p/10443469.html