C语言union联合体(共用体)

一、定义

联合体(共用体)是一种特殊的自定义的数据类型,它包含一系列的成员变量,这些成员变量共用一块内存空间。

语法:

union 标识符
{
    data_type 标识符1;
    data_type 标识符2;
    .
    .
    .
    date_type 标识符n;
};

typedef union
{
    data_type 标识符1;
    data_type 标识符2;
    .
    .
    .
    date_type 标识符n;
} 标识符;

 

#include <stdio.h>union un_1
{char c;int i;
};typedef union
{char c;int i;
} un_2;int main(int argc, char *argv[]) {union un_1 un1;un_2 un2;return 0;
}

二、特性

1. 联合体的所有成员变量共用一块内存空间。

这说明什么呢?

说明每个成员变量的内存地址是一样的,并且这个内存地址 = 联合体变量的内存地址。

#include <stdio.h>typedef union
{char c;int i;
} un_1;int main(int argc, char *argv[]) {un_1 un;printf("&un = %p\n", &un);printf("&un.c = %p\n", &un.c);printf("&un.i = %p\n", &un.i);return 0;
}

2.联合体变量内存空间的分布及大小。

在计算联合体大小的时候,遵循以下两条规则

(1)联合体的大小至少是成员中占用字节数最大的大小
(2)当成员中占用字节数最大的大小不是最大内存对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

#include <stdio.h>typedef union
{char c; //成员大小:1字节,内存对齐数为:1int i;  //成员大小:4字节,内存对齐数为:4
} un_1; //联合体大小:4字节(成员中最大字节数为4字节,是内存最大对齐数:4的整数倍)typedef union
{char c[5]; //成员大小:5字节,内存对齐数为:1int i;     //成员大小:4字节,内存对齐数为:4
} un_2; //联合体大小:8字节(成员中最大字节数为5字节,不是内存最大对齐数:4的整数倍,所以需要对齐到最大对齐数的整数倍:4*2=8)typedef union
{short s[5]; //成员大小:10字节,内存对齐数为:2int i;      //成员大小:4字节,内存对齐数为:4
} un_3; //联合体大小:12字节(成员中最大字节数为10字节,不是内存最大对齐数:4的整数倍,所以需要对齐到最大对齐数的整数倍:4*3=12)int main(int argc, char *argv[]) {printf("%d\n", sizeof(un_1));   // 4printf("%d\n", sizeof(un_2));   // 8printf("%d\n", sizeof(un_3));   // 12return 0;
}

分析:

(1)un_1 内存空间分布

typedef union

{

    char c; //成员大小:1字节,内存对齐数为:1

    int i;  //成员大小:4字节,内存对齐数为:4

} un_1; //联合体大小:4字节(成员中最大字节数为4字节,是内存最大对齐数:4的整数倍)

(2)un_2 内存空间分布

typedef union

{

    char c[5]; //成员大小:5字节,内存对齐数为:1

    int i;     //成员大小:4字节,内存对齐数为:4

} un_2; //联合体大小:8字节(成员中最大字节数为5字节,不是内存最大对齐数:4的整数倍,所以需要对齐到最大对齐数的整数倍:4*2=8)

(3)un_3 内存空间分布

typedef union

{

    short s[5]; //成员大小:10字节,内存对齐数为:2

    int i;      //成员大小:4字节,内存对齐数为:4

} un_3; //联合体大小:12字节(成员中最大字节数为10字节,不是内存最大对齐数:4的整数倍,所以需要对齐到最大对齐数的整数倍:4*3=12)

3.联合体数据类型包含一系列的成员变量。

一般情况下,成员变量的个数为两个或两个以上,那么,0个或只有1个成员变量可以吗?

只有 0 个成员变量的联合体虽然语法不报错,但是是毫无意义的,所以具有 0 个成员变量的联合体的数据大小为:0

只有 1 个成员变量的联合体其实就是一个具有一个成员变量的结构体。此时,这个联合体变量的大小 = 这个联合体的成员变量的大小。

#include <stdio.h>typedef union
{int i;
} un_1;typedef union
{} un_2;int main(int argc, char *argv[]) {printf("%d\n", sizeof(un_1));   // 4printf("%d\n", sizeof(un_2));   // 0return 0;
}

三、运用

1.用联合体检测大小端

大端模式:低地址存放高字节数据

小端模式:低地址存放低字节数据

int 类型数据:1 的存储格式为:

低地址 ----> 高地址

大端:00 00 00 01

小端:01 00 00 00

#include <stdio.h>typedef union
{char c;int i;
} un_1;int main(int argc, char *argv[]) {un_1 un;un.i = 1;if (un.c == 1) printf("小端\n");else if (un.c == 0)printf("大端\n");elseprintf("程序逻辑有误\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/216525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 144. 二叉树的前序遍历

这里面有一个知识点我没有详细讲&#xff08;求节点个数&#xff09;&#xff0c;大概我后期会讲一下&#xff0c;先了解这题思路即可 144. 二叉树的前序遍历 题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 题目链接 力扣&#xff08;LeetCode&#xf…

【初阶C++】入门(超详解)

C入门 前言1. C关键字(C98)2. 命名空间2.1 命名空间定义2.2 命名空间使用2.3嵌套命名空间 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用6.1 引用概念6.2 引用特性6.3 …

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

【价值几十万的仿抖音直播电商系统源码共享】

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;以抖音为首的直播电商模式备受用户追捧&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

17.认识下Docker之docker的核心原理(2)

1.容器-我的小世界 不知道大家看没看过小说《完美时间》&#xff0c;里面石昊经常进入一个小世界在里面与世隔绝的修炼或者战斗&#xff0c;总之就是在一个完全封闭的空间里做他想做的事情而与外界隔离&#xff0c;不受侵扰。通过前面的分析我们知道&#xff0c;Namepace让应用…

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

arm平台编译so文件回顾

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、几个点二、回顾过程 1.上来就执行Makefile2.编译第三方开源库.a文件 2.1 build.sh脚本2.2 Makefile3.最终编译三、其它知识点总结 前言 提示&#xff1a;这…

Python 小程序之PDF文档加解密

PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…

css 纯样式实现绘出进度条

效果&#xff1a; css代码&#xff1a; .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

无公网IP环境Windows系统使用VNC远程连接Deepin桌面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

【C++11】右值引用与移动语义

一.左值与右值 左值&#xff1a;可以取地址的表示数据的表达式&#xff0c;左值可以出现在赋值符号左边 右值&#xff1a;不能取地址的表示数据的表达式&#xff0c;右值不能出现在赋值符号左边 int fun() {return 0; } int main() {int a 0;//a->左值const int b 1;//b-&…

把 Windows 11 装进移动硬盘:Windows 11 To Go

本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统&#xff0c;将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具&#xff1a;Ventoy》这篇文章的最后&#xff0c;我提到了一个关键词 “WinToG…

【计算机网络】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行&#xff1a;包含三部分&#xff1a;协议版本&#xff0c;状态码&#xff0c;状态码描述响应头&a…

第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕

开幕快讯 2023年12月10日下午,由法国表现主义画院与东方荟萃艺术学院 联合主办的,由法中艺术交流协会、香港博物馆世界、让米歇尔艺术空 间共同协办,法国驻广州总领事馆支持的第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕! 嘉宾签到现场 本次展览集合了30位活…

多平台展示预约的服装小程序效果如何

线下实体服装店非常多&#xff0c;主要以同城生意为主&#xff0c;但随着电商经济增长&#xff0c;传统线下自然流量变少&#xff0c;商家们会选择线上入驻平台开店获得更多线上用户&#xff0c;包括自建私域小程序等。 而除了直接卖货外&#xff0c;线上展示预约在服装行业也…

第16章 网络io与io多路复用select/pool/epool

第16.1节 写一个服务端代码 服务端代码 #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>#include <fcntl.h>int main() {//openint sockfd sock…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…

Tomcat头上有个叉叉

问题原因&#xff1a; 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案&#xff1a; war模式&#xff1a;发布模式&#xff0c;正式发布时用&#xff0c;将WEB工程以war包的形式上传到服务器 war exploded模式&#xff1a;开发时用&#xff0c;将WEB工程的文件夹直接…

虚拟现实三维电子沙盘数字沙盘开发教程第5课

虚拟现实三维电子沙盘数字沙盘无人机倾斜摄影全景建模开发教程第5课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 在鼠标指定的位置增加自己的UI对象&…

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果&#xff1a; .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…