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.mzph.cn/news/220237.shtml

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

相关文章

【数组Array】力扣-5 最长回文子串

目录 题目描述 题解labuladong 题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab"…

在javaweb项目中resource目录和webapp目录的区别

resource存放的是一些配置文件&#xff0c;这些文件一般都是与java代码相关的配置文件&#xff0c;比如这里的jdbc配置文件,在java中可以使用这个目录下的文件&#xff0c;不用写全路径 webapp存放的是web的资源文件&#xff0c;如jsp,html,css&#xff0c;js文件,在网页请求会…

【NSX-T】5. 搭建NSX-T环境 —— NSX架构基础配置

目录 5. 准备 NSX 基础架构5.1 准备工作5.2 创建传输域&#xff08;1&#xff09;创建 Overlay 传输域&#xff08;2&#xff09;创建 VLAN 传输域 5.3 创建 IP 池5.4 准备 ESXi 主机 参考资料 5. 准备 NSX 基础架构 5.1 准备工作 vCenter 中已存在 DVS。 为 NSX-T 创建两个 …

计算机毕业设计 基于Web的城市旅游网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

ARM I2C通信

1.概念 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线&#xff0c;主要用于连接整体电路2.IIC总线硬件连接 1.IIC总线支持多主机多从机&#xff0c;但是在实际开发过程中&#xff0c;大多数采用单主机多从机模式 2.挂接到IIC总线上&#xff0c;每个从机设备都…

现代雷达车载应用——第2章 汽车雷达系统原理 2.4节 雷达波形和信号处理

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.4 雷达波形和信号处理 对于连续波雷达来说&#xff0c;波形决定了其基本信号处理流程以及一些关键功能。本节将以FMCW波形为例&#xff0c;讨论信号…

EasyRecovery2024苹果电脑mac破解版安装包下载

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

VS Code串口监视插件Serial Monitor

文章目录 初步使用参数设置VS Code插件 初步使用 Serial Monitor&#xff0c;即串行监视器&#xff0c;提供串口和TCP协议的通信监控功能。在插件栏搜索安装之后&#xff0c;按下Ctrl打开终端&#xff0c;终端界面会多出一个串行监视器选项卡&#xff0c;进入之后&#xff0c;…

golang反射(reflect)虽爽,但很贵

标准库 reflect 为 Go 语言提供了运行时动态获取对象的类型和值以及动态创建对象的能力。反射可以帮助抽象和简化代码&#xff0c;提高开发效率。 但是使用反射势必会多出大量的操作指令&#xff0c;导致性能下降 案例 字段赋值方式对比 type Student struct {Name string…

如何使用 Redis 快速实现分布式锁?

本文我们来讨论如何使用 Redis 快速实现分布式锁。 分布式锁有很多种解决方案&#xff0c;前面简单介绍过&#xff0c;Redis 可以通过 set key 方式来实现分布式锁&#xff0c;但实际情况要更加复杂&#xff0c;比如如何确保临界资源的串行执行&#xff0c;如何及时释放&#…

用Flask搭建简单的web模型部署服务

目录结构如下&#xff1a; 分类模型web部署 classification.py import os import cv2 import numpy as np import onnxruntime from flask import Flask, render_template, request, jsonifyapp Flask(__name__)onnx_session onnxruntime.InferenceSession("mobilen…

Tomcat部署Activiti官方 流程设计器【数据库更换为Mysql !!!】

一、官网下载activiti6 解压后结构如下: database&#xff1a; 存放数据库对象相关脚本&#xff0c;包含不同的数据库脚本 libs&#xff1a; 包含activiti开发过程中需要用到的jar包和源码&#xff0c;不建议通过jar包直接引用&#xff0c;建议通过maven进行管理 wars&am…

大模型应用_FastGPT

1 功能 整体功能&#xff0c;想解决什么问题 官方说明&#xff1a;FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;个人体会…

ubuntu将本机的wifi网络通过网线分享给另一台机器(用于没有有线网络,重装系统后无wifi驱动或者另一台设备没有wifi网卡)

1.将两台机器通过网线连接 2.在pci ethernet中设置选择另一台机器的mac address&#xff0c;ipv4中选择share to other computer&#xff0c;另一台机器上设置为动态ip&#xff0c;连接上之后另一台机器即可上网。

大数据机器学习深度解读DBSCAN聚类算法:技术与实战全解析

大数据机器学习深度解读DBSCAN聚类算法&#xff1a;技术与实战全解析 一、简介 在机器学习的众多子领域中&#xff0c;聚类算法一直占据着不可忽视的地位。它们无需预先标注的数据&#xff0c;就能将数据集分组&#xff0c;组内元素相似度高&#xff0c;组间差异大。这种无监…

Github 2023-12-14开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-14统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目5TypeScript项目2JavaScript项目1Jupyter Notebook项目1PHP项目1 基于项目的学习 创建周期&a…

Python进阶(一)

1.Python中一切皆对象 1.1 Python中一切皆对象 JAVA中有class和object这两个概念&#xff0c;object只是class的一个实例。 而在Python中面向对象更加的彻底&#xff0c;class和函数都是对象。代码也是对象&#xff0c;模块也是对象。 函数和类也是对象&#xff0c;对象有四…

AUTOSAR_SWS_LogAndTrace文档中文翻译

1 Introduction and functional overview 本规范规定了AUTOSAR自适应平台日志和跟踪的功能。 日志和跟踪为AA提供接口&#xff0c;以便将日志信息转发到通信总线、控制台或文件系统。 提供的每个日志记录信息都有自己的严重性级别。对于每个严重级别&#xff0c;都提供了一个单…

bugku--source

dirsearch扫一下 题目提示源代码&#xff08;source&#xff09; 也就是源代码泄露&#xff0c;然后发现有.git 猜到是git泄露 拼接后发现有文件 但是点开啥也没有 kali里面下载下来 wegt -r 下载网站的所有内容 ls 查看目录 cd 进入到目录里面 gie reflog 引用日志使用…

如何用python编写抢票软件,python爬虫小程序抢购

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python小程序抢购脚本怎么写&#xff0c;如何用python编写抢票软件&#xff0c;现在让我们一起来看看吧&#xff01; 大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python小程序抢购脚本怎么写&#xff0c;如…