14. 共用体

一、什么是共用体

  联合体也称为共用体,它使几种不同类型的变量存放到同一段内存单元中。所以共用体在同一时刻只能有一个值,它属于某一个数据成员。由于所有成员都位于同一块内存,因此共同体的大小至少是最大成员的大小。

  结构体与共用体之间的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员值会影响其余所有成员。

二、共用体的声明

  定义共用体变量的一般形式如下:

union 联合体名
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
};

  其中,uinon 关键字表示声明联合体,其后的联合体名表示该联合体的类型名,大括号中的变量构成联合体的成员,也就是一般形式的成员列表;

在声明联合体时,要注意括号最后面有一个分号“;”

三、共用体变量的定义

  声明一个联合体体表示的是创建一种新的类型名,需要用新的类型名在定义一个变量。定义的方式有 3 种:

【1】、声明联合体类型,再定义变量

union 联合体类型名 结构体变量;

【2】、在声明联合体时定义变量

union 联合体名
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
}变量名1, 变量名2, ..., 变量名n;

定义的变量不是只能有一个,可以定义多个变量;

【3】、直接定义联合体类型变量

  如果我们只需要确定个数的联合体变量,后面不需要再使用联合体数据类型定义变量,我们可以在定义时不给出联合体名。

union
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
}变量名1, 变量名2, ..., 变量名n;

四、共用体变量的初始化

  在定义共同体变量时,可以同时对共用体变量进行初始化操作。初始化的值放在一对大括号中。对共同体变量进行初始化时,只需要一个初始化值就足够了,其类型需要和共用体的第一个成员的类型一致。如果共用体的第一个成员是一个结构体类型,则初始化值可以包含多个用于初始化该结构体的表达式。

五、共用体变量的引用

  定义联合体之后,就可以引用其中的成员数据进行使用。引用的一般形式为:

联合体变量.成员名

不能直接引用共用体变量;

#include <stdio.h>

union data
{
    int n;
    char ch;
    short s;
};

int main()
{
    union data a = {100};

    printf("%d %d\n",sizeof(a),sizeof(int));
    printf("%d %c %d\n",a.n,a.ch,a.s);
    a.ch = 'a';
    printf("%d %c %d\n",a.n,a.ch,a.s);
    a.s = 50;
    printf("%d %c %d\n",a.n,a.ch,a.s);

    return 0;
}

六、共用体类型的数据特点

  1. 同一个内存段可以用来存放几种不同类型的成员,但是每一次只能存放其中一种,而不是同时存放所有的类型。也就是说,在共用体种,只有一个成员起作用,其它成员不起作用。
  2. 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
  3. 共用体变量的地址和它的各成员的地址是一样的。
  4. 共用体变量不能作函数参数,也不能作函数的返回值。
  5. 不能对共用体变量名赋值,也不能引用变量名来得到一个值。
posted @ 2023-03-11 12:28  星光映梦  阅读(52)  评论(0编辑  收藏  举报