C语言中自定义类型之联合体(共用体)的用法,能否详细解释一下?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1248个文字,预计阅读时间需要5分钟。
前言:联合集(UNION)在C语言中是不常用的,但并非不存在。在某些特定场景下,它有其独特用途。本文不深入探讨联合集的用途,仅介绍关于UNION的基本知识。
联合集(UNION)类型定义:联合集是一种特殊的数据类型,它允许存储不同类型的成员,但同一时间只能存储其中一个成员。联合集的定义如下:
ctypedef union { 类型1 成员1; 类型2 成员2; // ...} 联合集名;
在这里,`类型1`、`类型2`等可以是任何基本数据类型或自定义类型。`成员1`、`成员2`等是联合集中的变量名。联合集名是用户自定义的标识符,用于声明该联合集。
联合集的特点:
1.联合集的大小是其所有成员中最大者的大小。
2.在同一时间,联合集只能存储其中一个成员的值。
3.成员之间共享同一块内存空间。
示例:
c
typedef union { int i; float f; char c[10];} UnionType;UnionType u;
u.i=10;printf(Integer: %d\n, u.i);
u.f=3.14f;printf(Float: %f\n, u.f);
u.c[0]='A';printf(Char array: %s\n, u.c);
前言
联合体(
union)在C语言中是不常用的,不过存在就必然有其有用之处,这里不深入探讨联合体用在何处有什么用,本文章只介绍关于union的基本知识。
联合体(UNION)类型的定义
联合体也是一种特殊的自定义类型, 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合体也叫共用体)。
例如:
//联合体类型的声明
union Un // union Un 为联合体类型
{
// 公用空间的成员
char c;
int i;
};
union Un
{
char a[5];
int b;
}; // 注意要有分号
联合体的特点
联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。
例如这里分别打印i和c的地址,会发现他们的地址相同,这是因为他们公用同一块空间的地址:
#include <stdio.h>
union Un
{
int i;
char c;
};
union Un un;
int main()
{
// 下面输出的结果是一样的吗?
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
return 0;
}
运行结果:
可以看到,他们两个的地址是相同的。
这是因为:
联合体大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
- 假设这里默认对齐数为8。
例如:
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下面输出的结果是什么?
printf("%d\n", (int)sizeof(union Un1));
printf("%d\n", (int)sizeof(union Un2));
return 0;
}
联合体使用的典型例题 — 判断机器的大小端
在我之前的这篇t.csdn.cn/AKnbz博客中,已经介绍了大小端是什么,这里着重写联合体是怎么判断大小端的。
直接看代码实现:
#include <stdio.h>
union Un
{
char a;
int b;
};
//int sys_check();
int main()
{
union Un u;
u.b = 1;
if (u.a == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
运行结果:
可以看到,运用联合体判断出来vs是小端存储模式
调试后观察内存:
可以看到,的确为小端存储模式。
写在最后
- 能够熟练掌握联合体,说不定,在以后的某个时间就用上了呢。
- 到这里,C语言自定义类型的介绍结束了,一共有三大块:
结构体类型,枚举类型,联合体类型。- 以下是我写的结构体和枚举的博客链接,欢迎阅读噢:
结构体:t.csdn.cn/IRpyh枚举:t.csdn.cn/aeh10
感谢阅读本小白的博客,错误的地方请严厉指出噢!
本文共计1248个文字,预计阅读时间需要5分钟。
前言:联合集(UNION)在C语言中是不常用的,但并非不存在。在某些特定场景下,它有其独特用途。本文不深入探讨联合集的用途,仅介绍关于UNION的基本知识。
联合集(UNION)类型定义:联合集是一种特殊的数据类型,它允许存储不同类型的成员,但同一时间只能存储其中一个成员。联合集的定义如下:
ctypedef union { 类型1 成员1; 类型2 成员2; // ...} 联合集名;
在这里,`类型1`、`类型2`等可以是任何基本数据类型或自定义类型。`成员1`、`成员2`等是联合集中的变量名。联合集名是用户自定义的标识符,用于声明该联合集。
联合集的特点:
1.联合集的大小是其所有成员中最大者的大小。
2.在同一时间,联合集只能存储其中一个成员的值。
3.成员之间共享同一块内存空间。
示例:
c
typedef union { int i; float f; char c[10];} UnionType;UnionType u;
u.i=10;printf(Integer: %d\n, u.i);
u.f=3.14f;printf(Float: %f\n, u.f);
u.c[0]='A';printf(Char array: %s\n, u.c);
前言
联合体(
union)在C语言中是不常用的,不过存在就必然有其有用之处,这里不深入探讨联合体用在何处有什么用,本文章只介绍关于union的基本知识。
联合体(UNION)类型的定义
联合体也是一种特殊的自定义类型, 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合体也叫共用体)。
例如:
//联合体类型的声明
union Un // union Un 为联合体类型
{
// 公用空间的成员
char c;
int i;
};
union Un
{
char a[5];
int b;
}; // 注意要有分号
联合体的特点
联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。
例如这里分别打印i和c的地址,会发现他们的地址相同,这是因为他们公用同一块空间的地址:
#include <stdio.h>
union Un
{
int i;
char c;
};
union Un un;
int main()
{
// 下面输出的结果是一样的吗?
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
return 0;
}
运行结果:
可以看到,他们两个的地址是相同的。
这是因为:
联合体大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
- 假设这里默认对齐数为8。
例如:
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下面输出的结果是什么?
printf("%d\n", (int)sizeof(union Un1));
printf("%d\n", (int)sizeof(union Un2));
return 0;
}
联合体使用的典型例题 — 判断机器的大小端
在我之前的这篇t.csdn.cn/AKnbz博客中,已经介绍了大小端是什么,这里着重写联合体是怎么判断大小端的。
直接看代码实现:
#include <stdio.h>
union Un
{
char a;
int b;
};
//int sys_check();
int main()
{
union Un u;
u.b = 1;
if (u.a == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
运行结果:
可以看到,运用联合体判断出来vs是小端存储模式
调试后观察内存:
可以看到,的确为小端存储模式。
写在最后
- 能够熟练掌握联合体,说不定,在以后的某个时间就用上了呢。
- 到这里,C语言自定义类型的介绍结束了,一共有三大块:
结构体类型,枚举类型,联合体类型。- 以下是我写的结构体和枚举的博客链接,欢迎阅读噢:
结构体:t.csdn.cn/IRpyh枚举:t.csdn.cn/aeh10
感谢阅读本小白的博客,错误的地方请严厉指出噢!

