C语言——联合(共用体)~~详解

简介: C语言——联合(共用体)~~详解

一、联合的定义

联合也是一种特殊的自定义类型

这种类型定义也包含一系列的成员,特征是这些成员公用同一块空间

//联合类型的声明
union Un
{
  char c;
  int i;
};
int main()
{
  union Un un;//联合类型的定义
  printf("%d", sizeof(un));//计算联合类型变量的大小
  return 0;
}
运行结果: 4

二、联合的特点

联合的成员是公用一块内存空间的,那么一个联合变量的大小,至少是最大成员的大小。

那么,联合的成员的地址是一样的吗?

int main()
{
  union Un un;//联合类型的定义
  //printf("%d", sizeof(un));//计算联合类型变量的大小
  printf("%d\n", &(un.i));
  printf("%d\n", &(un.c));
  return 0;
}

运行结果:

再进一步验证:

un.i = 0x112233;
un.c = 0x66;
printf("%x\n", un.i);

运行结果:

这也更加验证了我们之前的结论,并且可以看出来是小端存储的。

三、联合大小的计算

联合大小计算的规则:

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

例如:

union Un1
{
  char c[5];//5 1VS8 1
  int i;// 4VS8 4
};
union Un2
{
  short c[7];//14 2VS8 2
  int i; //4VS8 4
};
int main()
{
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
}

运行结果:

四、联合的应用

上面提到了大小端存储的问题,我们可以巧妙的利用联合来判断大小端存储。

我们可以利用1在大小端的存储方式进行判断。

union Un
{
  int i;
  char c;
};
int main()
{
  //利用联合判断大小端存储
  union Un u1;
  u1.i = 1;
  if (u1.c == 1)
  {
    printf("小端存储!");
  }
  else
  {
    printf("大端存储!");
  }
}

运行结果:


目录
相关文章
|
1月前
|
存储 编译器 C语言
C语言共用体
C语言共用体
25 0
|
1月前
|
存储 安全 编译器
C语言(13)----联合和枚举
C语言(13)----联合和枚举
25 1
|
23天前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
19 2
|
4天前
|
C语言
【C语言】:枚举和联合
【C语言】:枚举和联合
6 0
|
1月前
|
存储 C语言
C语言基础专题 - 通过案例历学 - 共用体
C语言基础专题 - 通过案例历学 - 共用体
30 0
|
6月前
|
存储 算法 大数据
C语言结构体、联合与枚举类型
C语言结构体、联合与枚举类型
|
7月前
|
编译器 Linux C语言
讲一讲C语言中的结构体、位段、枚举与联合
讲一讲C语言中的结构体、位段、枚举与联合
|
7月前
|
C语言
C语言联合(共用体)
C语言联合(共用体)
22 0
|
开发框架 .NET 编译器
C语言之枚举&联合
枚举顾名思义就是:列举 。 即把可能的取值一一列举出来