Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >cpp的union使用

cpp的union使用

作者头像
Andromeda
发布于 2023-10-21 03:33:23
发布于 2023-10-21 03:33:23
26000
代码可运行
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏
运行总次数:0
代码可运行

union介绍

看一下下面的代码运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

union u
{
    char c;
    int n;
};

int main()
{
    cout << sizeof(u) << endl;
    return 0;
}

运行结果为4,实际上上面代码定义的union就是两个变量共用同一块内存。union的大小为最大的那一个变量。

它与结构体struct的不同就是struct需要满足内存对齐,例如下面这段代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

struct s
{
    char c;
    int n;
};

int main()
{
    cout << sizeof(s) << endl;
    return 0;
}

运行结果为8,也就是其中的c与n都占据了4个字节。

还可以在union内放结构体,也可以再结构体中放union。下面的示例代码运行结果为16 16 16 8。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

union U
{
    struct st
    {
        int x;
        long long y;
    } s;
    double z;
};

struct S
{
    union un
    {
        int x;
        long long y;
    } u;
    double z;
};

int main()
{
    cout << sizeof(U) << endl;
    cout << sizeof(U::s) << endl;
    cout << sizeof(S) << endl;
    cout << sizeof(S::u) << endl;
    return 0;
}

union判断端序

查看下面的示例代码,可以查看num的内存分布。运行结果为00001000 00000000 00000000 00000000,从最低位(LSB)开始输出,因此使用的是小端存储。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
 #include <bits/stdc++.h>
 using namespace std;
 ​
 union U
 {
     unsigned char bits[4];
     int num;
 };
 ​
 int main()
 {
     U u;
     u.num = 8;
     for (int i = 0; i < 4; i++)
    {
         cout << bitset<8>(u.bits[i]) << " ";
    }
     return 0;
 }

union比较短字符串

在字符串中,一般情况下比较相等是通过比较哈希值。可以通过下面的示例代码通过union快速获得短字符串的哈希值进行比较。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
 using namespace std;
 ​
 union U
 {
     unsigned long long hs;
     char s[8];
 };
 ​
 int main()
 {
     U u1, u2;
     memcpy(u1.s, "hello", 6);
     memcpy(u2.s, "hello1", 7);
     cout << u1.s << " " << u2.s << endl;
     cout << u1.hs << " " << u2.hs << endl;
     return 0;
 }

union取别名

在一些二维的问题中,一般都是,定义点,然后点构成了线。但是访问具体的数据就要通过line.p1.x这样的语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct point
 {
     int x, y;
 };
 struct line
 {
     point p1, p2;
 };

可以通过union来实现内存共享。arr数组与两个点p1、p2共享内存,访问数据更加便捷。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
 using namespace std;
 ​
 struct point
 {
     int x, y;
 };
 ​
 struct line
 {
     union
    {
         struct
        {
             point p1, p2;
        };
         int arr[4];
    };
 };
 int main()
 {
     line L = {0, 0, 6, 9};
     cout << L.p1.x << " " << L.p1.y << endl;
     cout << L.p2.x << " " << L.p2.y << endl;
     cout << sizeof(line) << endl;
     return 0;
 }

union实现动态类型

下面这段代码实现一个简单的动态类型。给var类型变量赋值时,会根据参数类型调用对应的构造函数,然后为union结构赋值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
 using namespace std;
 ​
 struct var
 {
     union
    {
         int num;
         double dbnum;
         char *str;
    };
     var(const int &n) : num(n){};
     var(const double &dn) : dbnum(dn){};
     var(const char *s)
    {
         str = new char[strlen(s) + 1];
         memcpy(str, s, strlen(s) + 1);
    };
 };
 ​
 int main()
 {
     var v = 99;
     cout << v.num << endl;
     v = 10.2;
     cout << v.dbnum << endl;
     v = "hello";
     cout << v.str << endl;
     return 0;
 }

这段代码输出的结果如下

99 10.2 hello

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
1.C与C++
使用c++中的标准库类型vector可以很轻松的完成任务。 不需要管理内存分配,对不同的类型都可以处理
小飞侠xp
2018/12/14
1.1K0
1.C与C++
算法竞赛入门【码蹄集新手村600题】(MT1551-1600)[通俗易懂]
(1)题目描述 有一个字符数组存有多个字符串(一个紧接一个) : i\0love\0my\0mother\0
全栈程序员站长
2022/11/08
1.2K0
C++课本的练习题及答案(第五章)
1.语句  cout<<(1&2)<<","<<(1&&2)<<endl;  的输出结果是(    )。
Twcat_tree
2022/11/29
8670
数据结构期末52道OnlineJudge机试题目考核-大二上
<!--more--> <center> <a href="https://s2.ax1x.com/2019/12/28/lmEb9K.png" class="highslide" onclick="return hs.expand(this,{slideshowGroup:'images'})"><img src="https://s2.ax1x.com/2019/12/28/lmEb9K.png" alt="lmEb9K.png" border="0" /></a></center> **所有题目全部在杭电OJ完成:**[http://acm.hdu.edu.cn/](http://acm.hdu.edu.cn/) ```c //1000 A + B Problem #include<iostream> using namespace std; int main(){ int a,b,sum; while(cin>>a>>b){ sum = 0; sum = a + b; cout<<sum<<endl; } } ``` ```c //1005 Number Sequence #include <iostream> int A,B; int f(int n){ if( n == 1 || n == 2){ return 1; } return (A*f(n-1)+B*f(n-2))%7; } int main(){ int n; while(scanf("%d%d%d",&A,&B,&n)!=EOF,A||B||n){ int a = f(n%49); printf("%d\n",a); } } ``` ```c //1008 Elevator #include<iostream> using namespace std; int main(){ int n,a[100],i,sum; while(cin>>n&&n!=0){ sum = 0; for(i=0;i<n;i++){ cin>>a[i]; } if(n==1){ sum = a[0]*6+5; } else{ sum = n*5+a[0]*6; for(i=0;i<n-1;i++){ if(a[i+1]>a[i]){ sum += (a[i+1]-a[i])*6; } else{ sum += (a[i]-a[i+1])*4; } } } cout<<sum<<endl; } } ``` ```c //1012 u Calculate e #include<stdio.h> int main() { double e; int i, tmp; e = 1; tmp = 1; printf("n e\n"); printf("- -----------\n"); printf("0 1\n"); for(i = 1; i < 10; i++) { tmp *= i; e += 1.0/tmp; if(i>=3) printf("%d %.9lf\n", i, e); else if(2 == i) printf("%d %.1lf\n", i, e); else printf("%d %.0lf\n",i, e); } } ``` ```c //1032 The 3n + 1 problem #include <iostream> using namespace std; int main() { int a,b,t,i,max; while(cin >> a >> b) { cout << a << " " << b << " "; if(a>b)//大小不确定 { t = a; a = b; b = t; } max = 0;
王荣胜
2020/03/12
6880
3.类和对象
类的基本思想:数据抽象和封装 数据抽象是一种依赖接口和实现分离的编程技术 接口:类的用户所能执行的操作 实现:类的数据成员、接口函数的实现及其他私有函数的实现 封装:实现了类的接口和实现分离 封装后的类隐藏了实现细节; 类的用户只能使用接口而无法访问实现部分。 面向对象三大特性:封装、继承、多态
小飞侠xp
2018/12/25
5390
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
按行获取字符串:char *fgets(char *str, int n, FILE *stream);
SarPro
2024/02/20
1820
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
HPU personal-training 2
A - Kefa and Park 题意:就是一棵树,然后本人的家在根上,餐厅在叶子节点上。然后在前往叶子结点的餐厅的时候,途中的结点上有猫,而这个人特别怕毛,如果猫超过M只,那么他就不会走这条路!最终要你输出他能去餐厅的数量,也就是多少条路!
杨鹏伟
2020/09/11
2970
18级个人训练赛--2
B --Consecutive Integers AtCoder 5037 思路:水题,签到~
杨鹏伟
2020/09/11
3090
C++ Primer Plus习题及答案-第十六章
因为string对象提供了自己的内存管理功能,所以不需要再显式定义复制构造函数、析构程序和赋值运算符。
艰默
2023/02/26
9740
C++ Primer Plus习题及答案-第十六章
数据对齐详解
Author:bakari           Date:2012.8.26 数据对齐实际上是内存字节的对齐,今天偶然翻开自己以前做的笔记,发现做了好多的题,但现在对于我来说觉得很陌生。上网查了一下数据对齐的原因和方式,现在把它整理出来以备之后的学习复习巩固。 一、什么是数据对齐 1、现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个
Linux云计算网络
2018/01/10
1.9K0
数据对齐详解
C++ struct与union
编码运行环境:VS2017+Win32+Debug,Win32表示生成32bits的应用程序。
恋喵大鲤鱼
2019/02/22
2.3K0
【C++100问】一篇文章(16个小例子)带你入门C++的编程世界(基础篇)
文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever
我是管小亮
2020/04/20
6810
令人闻风丧胆的NEERC——被称为ICPC题目质量之最的比赛,究竟是怎样的难度
NEERC,ACM-ICPC Northeastern European Regional Contest,是欧洲地区的异常区域赛,因其题目质量高而闻名于ICPC。
ACM算法日常
2021/09/28
1.8K0
C++016-C++结构体
在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/
用户2225445
2023/10/16
1880
C++016-C++结构体
C++ 数据结构和算法入门笔记
世界上的所有事物都可以看做是对象,二对于每个对象,抽想起来均可以分为两个要素,属性和行为。
独元殇
2023/03/14
1.6K0
ACM刷题之路(十六)Acm程序设计竞赛自制模板
   本模板是我在备战省赛的时光中,把复习过的和新学的算法中比较常用的代码、思路,整合成了模板,供以后的ACM竞赛直接使用,因为时间匆忙、水平有限,若有不足之处,欢迎大佬提出。本版本为V1.0版,会不定期更新。
Designer 小郑
2023/07/31
4180
ACM刷题之路(十六)Acm程序设计竞赛自制模板
C++ struct与union
编码运行环境:VS2012+Win32+Debug Win32既表示运行平台是Windows 32bits操作系统,又表示生成32bits的应用程序。
恋喵大鲤鱼
2018/08/03
6360
C++ STL 标准模板库(容器总结)算法
C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都是目前最优解,该库既能保证软件代码的高可复用性,又能保证代码具有相当高的执行效率,STL库是ANSI/ISO的C++标准的具体实现,任何标准库的实现都是以源码形式释出的.
王瑞MVP
2022/12/28
2.3K0
码蹄集新手村100题答案
码蹄集是今年新上线的一个OJ平台,内含了100道基础题和一些百度之星的题目。由于很多题目有原创性,搜不到相关解答,因此我花了两天特将100道题目刷了一遍,目前位居榜二。 码蹄集传送门:https://www.matiji.net/exam/ojquestionlist 前言 所有题目均能AC,不一定是最佳方法,如有其它方法,可在评论区留言讨论。 1、程序设计入门 #include <iostream> using namespace std; int main( ) { cout <
zstar
2022/06/14
6230
码蹄集新手村100题答案
【编码狂想】深度探索C++编程之旅:“数组、字符串、函数与KMP算法解密“
键盘随机输入 6 个整数,将这些数据保存到数组中,获取数组中的最小值和最大值并输出。
SarPro
2024/02/20
1600
相关推荐
1.C与C++
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文