C——Union是什么?Union和Struct这么像,区别在哪?为什么还要创造出union呢?需要在哪里使用呢?

这篇具有很好参考价值的文章主要介绍了C——Union是什么?Union和Struct这么像,区别在哪?为什么还要创造出union呢?需要在哪里使用呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 C 语言中,有一种叫做union的变量,是用来在不同的情况下,存放不同类型和大小的对象的变量。这与结构体struct很相似:结构体是一个或多个变量的集合。

union 的声明方式非常简单,也与struct一模一样,如下:

union u_tag {
    int ival;
    char *sval;
} u;

可以看到,唯一的不同就是结构体中的struct变成了union

使用方法也一模一样:

//一般变量
union_name.val
//指针
union_pointer->val

二者这么像,那么二者的区别在哪里呢?或者说,为什么要弄两个这么像的东西呢?C 又不是 C++,一些功能是由不同的小组开发的,一些功能上会重叠。

首先是表面的不同,structunion在使用目的上完全不一样,union并不像struct会同时存放大括号中列出的每个变量,如果你尝试下面的代码

union u_tag {
    int a;
    int b;
} u;

int main()
{
    u.a=1;
    u.b=2;
    printf("u_tag: %d\n", u.a);
    return 0;
}

那么输出的结果为:

u_tag: 2

这里的结果不是出错了,是因为union并不会像结构体一样,去根据前面的u.a=1输出1,由于只能存放一种数据,所以后面的u.b=2覆盖了原本u存放的值。

所以说,union内部声明的变量可以理解成是一种可能,而不是实际的对象或成员变量

并且由于union内部只有一个值,所以一般不会使用相同的数据类型。至于目前包含什么数据类型,这是编程的时候需要程序员注意的。一般是用一个变量u_type,然后再用判断语句来判断当前包含的类型。

但是structunion最核心的不同,也是union诞生的理由是:分配空间的机制。

如果你用sizeof()测量下面两个数据的尺寸

union u_tag {
    int ival;
    float fval;
    char *sval;
} u;

struct s_tag {
    int ival;
    float fval;
    char *sval;
} s;

会发现,u_tag的尺寸是 8 个字节,但是s_tag的尺寸是 16 个字节 。这是因为union相当于给内部声明的数据类型留了一个最大空间,而struct是给每个数据类型都留了各自的空间。

在现在的绝大部分机器上,int类型为 4 字节,float类型为 4 字节,cahr *类型为 8 个字节。所以u就占据了最大空间,也就是 8 个字节,而s则每个都留了各自的空间,也就是 4+4+8=16 字节。

那么需要在什么时候使用union呢?
首先根据其存放一种数据的特点,可以用来做一些通用计算,比如说浮点数和整数的切换等。
其次上面的使用目的下,节省空间了。虽然这种情况下也可以使用结构体,但是上面三种数据类型就差一倍大小的情况算好的。因为内存地址分配机制,一些类型的数据的地址是由特殊要求的,比如说在一些机器上,int需要在偶数位的地址。

下面就是一个例子,但是整数的地址限制并不是在偶数,而是 4 的倍数。

struct s_tag {
    int ival;
    char a;
} s;

这个结构体的大小为 8 个字节,你可以自己试试看是不是这个大小。

并且由于编译器是顺序读取的,所以如果你写成下面这样

struct s_tag {
    int a;
    char b;
    int c;
    char d;
} s;

那么这个结构体的大小为 16 字节。这种情况下可以将同一类的数据写在一起,可以节约一些空间,如下:

struct s_tag {
    int a;
    int c;
    char b;
    char d;
} s;

这样这个结构体所占用的空间大小就为 12 字节了。而如果使用union,那么无论什么顺序,大小一直为 4 字节。随着数据类型的可能性越来越多,节约空间的必要性就凸显出来了。

希望能帮到有需要的人~文章来源地址https://www.toymoban.com/news/detail-438762.html

到了这里,关于C——Union是什么?Union和Struct这么像,区别在哪?为什么还要创造出union呢?需要在哪里使用呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用。在分布式架构下, 为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现不同应用程序之间的数据交换和信息传递。其中常

    2024年02月05日
    浏览(38)
  • 既然有HTTP协议,为什么还要有RPC?

    我想起了我刚工作的时候,第一次接触RPC协议,当时就很懵, 我HTTP协议用得好好的,为什么还要用RPC协议?   于是就到网上去搜。   不少解释显得非常官方,我相信大家在各种平台上也都看到过,解释了又好像没解释,都在 用一个我们不认识的概念去解释另外一个我们不

    2024年02月09日
    浏览(26)
  • 既然有Map了,为什么还要有Redis?

    以下内容转自掘金 作者:哪吒编程 Redis可以存储几十个G的数据,Map行吗? Redis的缓存可以进行本地持久化,Map行吗? Redis可以作为分布式缓存,Map只能在同一个JVM中进行缓存; Redis支持每秒百万级的并发,Map行吗? Redis有过期机制,Map有吗? Redis有丰富的API,支持非常多的应

    2024年02月03日
    浏览(45)
  • CentOS软件那么老为什么大家还要用它?

    作为一个专业的服务器系统,RHEL 系统理论上每一个软件包都有 RedHat 内部的人员负责维护,这个维护包括长期(和系统生命周期一样长)的开发、更新、测试、运维等。也就是说你能从 RHEL 系统源上获得的每一个软件包,出现问题都可以找 RedHat 负责。所以 RHEL 不可能无限制

    2024年02月01日
    浏览(42)
  • 既然有 HTTP 协议,为什么还要有 RPC

    什么是HTTP HTTP 协议( H yper T ext T ransfer P rotocol),又叫做 超文本传输协议 。平时上网在浏览器上敲个网址就能访问网页,这里用到的就是HTTP协议。 什么是RPC RPC ( R emote P rocedure C all),又叫做 远程过程调用 。它并不是一个具体的协议,而是一种 调用方式 。 像之前的单体

    2024年02月09日
    浏览(28)
  • 云服务器那么安全稳定,为什么大厂还要自建机房

    一般来说选择自建机房或者是云服务商要考虑的几个问题 成本 安全性 管理 通常来说自建机房,需要自己考虑很多问题,比如 电费 网络 Raid 可靠性 安全性 还要计算运维的成本 似乎从哪个角度来说,自建机房都是不大划算的。 但是为什么还有一些公司要自建机房呢? 首先

    2023年04月08日
    浏览(38)
  • 【容器架构】你知道有 Docker 为什么还要 K8s 吗?

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人 Java知识图谱点击链接: 体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收藏关注下 , 不然下次找不到哟

    2024年02月16日
    浏览(59)
  • Netty为什么高效,为什么这么受欢迎?

    上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。 我们先看

    2024年02月12日
    浏览(57)
  • 为什么需要分布式存储技术?IPFS价值在哪?

    IPFS中文翻译是星际文件系统,是硬盘共享的互联网底层协议,主要用于访问数据。简单来说,IPFS可以创建一个存储网络,让更多的人在分享闲置存储空间的同时获得收入。 这种人人都可以参与共享硬盘的存储模式,称为分布式存储。为什么我们需要这种分布式存储技术?要

    2024年02月13日
    浏览(42)
  • 区块链到底是什么,为什么这么火爆

    一、相关背景介绍 互联网上的贸易,几乎都需要借助可资信赖的第三方信用机构来处理电子支付信息。这类系统仍然内生性地受制于“基于信用的模式”。 区块链技术是构建比特币区块链网络与交易信息加密传输的基础技术。它基于密码学原理而不基于信用,使得任何达成

    2023年04月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包