C语言 共用体

共用体支持将几种不同类型的变量存放到同一段内存单元中。

一、什么是共用体类型

有时想用同一段内存单元存放不同类型的变量。

例如,把一个短整形、一个字符型变量和一个实性变量放在同一个地址开始的内存单元上。

这些变量在内存中占的字节数不同,但都从一个地址开始。这种使几个不同变量共享同一段内存的结构,称为“共用体结构”。

二、声明共用体类型

1
2
3
union 共用体名{
成员表列;
}变量表列;

例如:

  • 声明类型的同时定义变量:

    1
    2
    3
    4
    5
    union Data{
    int i;
    char ch;
    float f;
    }a, b, c;
  • 先声明类型,后定义变量

    1
    2
    3
    4
    5
    6
    union Data{
    int i;
    char ch;
    float f;
    };
    union Data a, b, c;
  • 不声明类型直接定义变量

    1
    2
    3
    4
    5
    union{
    int i;
    char ch;
    float f;
    }a, b, c;

三、共用体变量的使用

1
共用体变量名.成员名

例如:

1
printf("%d %c", a.i, a.ch);

四、共用体的特点

1.成员不能共存

同一个内存段可以用来存放几种不同类型的成员,但同时只能存放其中的一个成员,即不能同时访问。因为存储单元一次只能存储一个值。

代码如下:

1
2
3
4
5
6
7
union Data{
int i;
char ch;
float f;
}a;
a.i = 2487897;
printf("%d\n%c\n%f\n", a.i, a.ch, a.f);

运行结果:

1
2
3
2487897
Y
0.000000

因为此时共用体的内存中存放的是 int 型的数据,若调用其它成员,将会以其它类型的方式读取该内存上的内容,导致这样的结果。

2.可以初始化

可以对共用体变量初始化,但初始化表中只能有一个常量。

初始化第一个成员:

1
union Data a = {16};

初始化指定成员:

1
union Data a = {.ch = 'j'};

3.赋值将会覆盖

共用体变量中起作用的是最后一次被赋值的成员,每次赋值,原有的值都会被取代。

4.共用体和成员同地址

共用体变量的地址和它各成员的地址都是同一地址。

5.共用体可以相互赋值

C99 规定

6.共用体及其指针可以作为函数参数

C99 规定

7.共用体、结构体和数组

共用体可以出现在结构体中,也可以定义数组。

结构体也可以出现在共用体中,数组也可以作为共用体成员。

参考