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,一经查实,立即删除!

相关文章

linux面试题 Java工程师、C++工程师、iOS工程师、安卓工程师、运维工程师、PHP工程师、安全工程师、2020、golang工程师等面试可用

下列有关const限定符说法错误的是&#xff1a; A. 可以将一个非const对象的地址赋给一个指向const对象的指针B. 可以将一个非const对象的地址赋给一个指向非const对象的指针C. 一个const对象不可以被多次赋值D. 通过const对象指针可以改变全局const对象内容 正确答案&#xff1…

华为OD机试-内存冷热标记(JavaPythonJs)100%通过率

题意 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定闽值,则认为是热内存页,否则是冷…

第18节:Vue3 数组和集合的注意事项

在UniApp中使用Vue3框架时&#xff0c;处理数组和集合需要注意以下几点&#xff1a; 数组和集合的初始化&#xff1a;在Vue3中&#xff0c;可以使用ref()函数来创建一个响应式引用对象&#xff0c;然后使用该引用来初始化数组或集合。例如&#xff1a; import { ref } from vu…

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

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

MySQL:JSON语法说明

一、SELECT JSON_OVERLAPS([5261,5265], [5265,5278,1000]) -- 0不存在 1存在(比较两个数组是否有匹配) 二、SELECT JSON_CONTAINS([1,2,3,4,5,6,7], CAST(4 AS CHAR)) -- key是字符串类型&#xff08;比较字符串是否在数组中存在&#xff09; 三、JSON_EXTRACT(eas.question_…

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

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

Golang 链表的创建和读取 小记

文章目录 链表的相关知识链表的创建:模拟方式建立链表的**递归创建** 链表的读取遍历读取递归读取 完整代码 链表的相关知识 链表有时会具有头节点&#xff0c;头节点的指针指向第一个节点的地址&#xff0c;其本身的数据域可以根据自己的选择进行赋值   接下来我将以将int转…

【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; 精…

css中2D/3D的变化

变换可以改变元素的位置、大小、旋转、倾斜等属性&#xff0c;以创建各种动态效果。 一、常用的2D变换&#xff1a; 平移&#xff08;translate&#xff09;&#xff1a;使用 translate() 函数来改变元素的位置。可以指定水平和垂直方向的偏移量&#xff0c;如 transform: tra…

【RabbitMQ高可用集群架构】

文章目录 一、保证RabbitMQ服务高可用1.RabbitMQ如何保证消息安全2、搭建普通集群3、搭建镜像集群 RabbitMQ如何保证消息不丢失1、RabbitMQ消息零丢失方案&#xff1a;1》生产者保证消息正确发送到RibbitMQ2》 RabbitMQ消息存盘不丢消息3》 RabbitMQ 主从消息同步时不丢消息4》…

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;个人体会…