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

 更新时间:2021年02月08日 11:34:29   作者:沐歌爱编程  
这篇文章主要介绍了C语言关键字union的定义和使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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语言关键字union的定义和使用详解的文章就介绍到这了,更多相关C语言 union关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言 sizeof关键字的具体使用

    C语言 sizeof关键字的具体使用

    在C语言中,sizeof是一个非常常用的关键字,本文主要介绍了C语言 sizeof关键字的具体使用,包括sizeof 关键字的语法、用法、特点和注意事项,感兴趣的可以了解一下
    2024-02-02
  • 浅析C语言中sscanf 的用法

    浅析C语言中sscanf 的用法

    以下是对C语言中sscanf函数的使用方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • 详解C语言之堆栈

    详解C语言之堆栈

    这篇文章主要为大家介绍了C语言的堆栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 基于c++强制类型转换的(总结)详解

    基于c++强制类型转换的(总结)详解

    本篇文章对C++中的强制类型转换进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C++中引用处理的基本方法

    C++中引用处理的基本方法

    引用不是新定义了一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,他和他引用的变量共用一块内存空间,下面这篇文章主要给大家介绍了关于C++中引用处理的基本方法,需要的朋友可以参考下
    2022-12-12
  • C语言编程数据结构栈与队列的全面讲解示例教程

    C语言编程数据结构栈与队列的全面讲解示例教程

    本文介绍着重介绍数据结构-栈和队列的知识,由于本文也设计多个动态内存开辟函数,小伙伴们在学习本文之前,一定一定一定要把动态内存开辟相关知识掌握牢固,这样学习起本文才能事半功倍
    2021-10-10
  • C语言实现出栈序列合法性判定

    C语言实现出栈序列合法性判定

    这篇文章主要为大家详细介绍了C语言实现出栈序列合法性判定,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++ 中Vector常用基本操作

    C++ 中Vector常用基本操作

    标准库vector类型是C++中使用较多的一种类模板,本文给大家分享C++ 中Vector常用基本操作,感兴趣的朋友一起看看吧
    2017-10-10
  • C语言堆实现建堆算法和堆排序

    C语言堆实现建堆算法和堆排序

    本文主要介绍了C语言堆实现建堆算法和堆排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • C++命名空间和缺省参数介绍

    C++命名空间和缺省参数介绍

    这篇文章主要介绍了C++命名空间和缺省参数,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,缺省参数是声明或定义函数时为函数的参数指定一个默认值,更多详细内容需要的小伙伴可以参考下面文章内容
    2022-01-01

最新评论