C语言丨关键字union的定义和使用

news/2025/2/13 6:35:53/

union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

但在“联合”中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 。一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型。

当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值。

另一方面,如果结构对象具有静态存储周期,那么其非指针成员初始值是 0,其指针成员初始值是空指针。

不同于结构成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。因此,可以定义一个拥有许多成员的联合,但是同一时刻只能有一个成员允许含有一个值。联合让程序员可以方便地通过不同方式使用同一个内存位置。

 

一、定义联合(union)

联合的定义方式与结构是一样的,只是把关键字 struct 改成 union:

union [标签名称]{成员声明列表};

下面的例子定义了一个名为Data的联合类型,它有 3 个成员:i、x 和 str:

union Data { int i;double x;char str [16];};

这种类型的对象可以存储一个整数、一个浮点数或一个短字符串。

例如:

union StateMachine 

   char character; 

   int number; 

   char *str; 

   double exp; 

}; 

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。 

在C++里,union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。 

二、初始化联合(union)

与结构类似,通过初始化列表(initialization list)来初始化联合对象。但是,对联合来说,列表只有一个初始化器(initializer)。

与结构一样,C99 允许在初始化器中使用成员指示符来指示哪个成员被初始化。而且,如果初始化器没有成员指示符,那么就与联合内的第一个成员关联。具有自动存储类的联合对象也可以使用已有的同类型对象来初始化。下面是一些初始化例子:

union Data var1={77},

var2={.str="Mary"},

var3=var1,

myData[100]={{.x=0.5},{1},var2};

数组 myData 中的元素如果没有指定初始化器,会被隐式地初始化为 0 值。

三、联合体变量的声明

 联合变量的说明和结构变量的声明方式相同, 也有三种形式:

 第一种 , 先定义联合体类型,再声明联合体变量 ; 

 第二种 ,定义联合体类型的同时声明联合体变量;

 第三种 ,直接声明联合体(以匿名的形式定义联合体类型)。

以perdata类型为例,说明如下: 

第一种, 先定义联合体类型,再声明联合体变量

union   perdata

{

   int class;

   char officae[10];

};

union   perdata  a,b;  /*说明a,b为perdata类型*/

第二种, 定义联合体类型的同时声明联合体变量:

union  perdata

int class;

char office[10]; 

} a , b ;

第三种, 直接声明联合体(以匿名的形式定义联合体类型):

union

int class;

char office[10]; 

}a,b 

经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。对a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。

四、联合体变量的赋值和使用

 对联合体变量的赋值,使用都只能是对变量的成员进行。 

联合变量的成员表示为:  联合变量名 . 成员名  

例如,a被说明为perdata类型的变量之后,可使用 a.class,a.office 

不允许只用联合变量名作赋值或其它操作。 也不允许对联合变量作初始化赋值,赋值只能在程序中进行。

一个联合体变量, 每次只能赋予一个成员值。一个联合变量的值就是联合变员的某一个成员值。

五、struct和union和区别

1.结构和联合都是由多个不同的数据类型成员组成的,但是在任一时刻联合只存放一个被选中的成员,而结构的所有成员都存在。

2。对于联合的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对结构的不同成员赋值是会不影响的。

对联合变量的赋值,都只能对变量的成员进行,一个联合变量每次只能赋值给一个成员,一个联合变量的值就是当前联合变量的某一个成员值。

应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

 

如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍:

 

编程学习视频:

 


http://www.ppmy.cn/news/497341.html

相关文章

蓝牙键盘无法连接 ,win10要求输入pin码可是却不显示pin码

解决方案:打开“设备和打印机”,切换到在设备上输入密码就可以显示PIN码。

c++字符前面的L和_T

c字符前面的L和_T 字符串前面加L表示该字符串是Unicode字符串。 _T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变。因此,Visual C里边定义字符串的时候&…

关于C++中四字节对齐的坑

最近做一个工程,大体的意思是在程序中定义一个结构,运行中会将结构直接写到文件中,然后另一个程序会用同样的结构读出来。为了验证是写文件的程序的问题还是读文件的程序的问题,用winhex来打开文件,仿照结构体定义写tp…

C/C++ union联合体你绝对不知道的知识

union的特点和性质我们不再介绍&#xff0c;我们讲一些UB的东西 #include<iostream> union Test {int a;double b;char ch; }t; int main() {t.b 12000.0;t.a 13;printf("%d\n", t);printf("%lf\n", t);printf("%zd\n", sizeof(t));prin…

c/c++,输入一个字符

getch()、getche()和getchar()函数 (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符。其调用格式为: getch(); getche(); 两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche() 函数却将读入的字符回显到显示屏幕上。 例1: #include<stdio.…

用c++做电子键盘——【S神】~苏嘉亿

最近闲在家里&#xff0c;有事没事就发篇博文 希望你能给点赞 好的&#xff0c;进入主题——如何用C制作电子键盘呢&#xff1f; 相信大家也和我一样有着刨根问底的精神&#xff0c;和浓厚的好奇心想要跟我一探究竟 很简单&#xff0c;这是我们主要的一个头文件&#xff1a; #…

【C++】数位DP的模板(找到小于n的数字的每位组成)

整理自Leetcode大佬灵神&#xff08;灵茶山艾府&#xff09;的板子&#xff0c;感谢大佬的题解ψ(&#xff40;∇)ψ 大佬 1 思路讲解 以力扣的2376题为例&#xff1a; 我们先去看当n 123为例子时的思路&#xff0c;可以把问题看作是f(i, mask)然后一共有三个位置i&#xff…

现代C++20

类型 std::optional std::variant nullptr_t decltype auto 值和引用不同 左值&#xff0c;右值&#xff0c;将亡值都是值 左值引用&#xff0c;右值引用&#xff0c;转发引用(模板中的 T&&) 都是引用&#xff0c;是可以取地址&#xff0c;std::move()来变成右值…