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

news2024/11/25 6:21:24

一、定义

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

语法:

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字节,内存对齐数为:1
    int i;  //成员大小:4字节,内存对齐数为:4
} un_1; //联合体大小:4字节(成员中最大字节数为4字节,是内存最大对齐数:4的整数倍)

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

typedef union
{
    short s[5]; //成员大小:10字节,内存对齐数为:2
    int i;      //成员大小:4字节,内存对齐数为:4
} un_3; //联合体大小:12字节(成员中最大字节数为10字节,不是内存最大对齐数:4的整数倍,所以需要对齐到最大对齐数的整数倍:4*3=12)

int main(int argc, char *argv[]) {
    printf("%d\n", sizeof(un_1));   // 4
    printf("%d\n", sizeof(un_2));   // 8
    printf("%d\n", sizeof(un_3));   // 12

    return 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));   // 4
    printf("%d\n", sizeof(un_2));   // 0

    return 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");
    else
        printf("程序逻辑有误\n");

    return 0;
}

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

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

相关文章

电影推荐系统

基于springboot vue实现的电影推荐系统&#xff0c;通过Jsoup数据爬取。 效果图如下&#xff1a;

Java01 169-184

数组添加 import java.util.Scanner; public class ArrayAdd02 {public static void main(String[] args) {Scanner myScanner new Scanner(System.in);//数组一旦定义&#xff0c;不可以增加&#xff0c;必须增加新的数组int[] arr {1, 2, 3};do {int[] arrNew new int[arr…

2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题&#xff0c;包含G3锅炉水处理免费试题答案和解析及G3锅炉水处理模拟试题练习。安全生产模拟考试一点通结合国家G3锅炉水处理考试最新大纲及G3锅炉水处理考试真…

目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集 DOTA数据集包含2806张航空图像&#xff0c;尺寸大约从800x800到4000x4000不等&#xff0c;包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形&#xff08;区别于传统的对边平行bbox&#xff09;。类别分别为&#xff1a;plane, ship, s…

20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式&#xff0c;该模式将当前对象的内部状态保存到备忘录中&#xff0c;以便在需要时能将该对象的状态恢复到原先保存的状态。 备忘录模式提供了一种保存和恢复状态的机制&#xff0c;常用于快照的记录和状态的存储&#xff0c;在系统发生故障或数据发生…

为什么QLC NAND才是ZNS SSD最大的赢家?-part2

ZNS出现的背景是什么&#xff1f;ZNS SSD的原理是把namespace空间划分多个zone空间&#xff0c;zone空间内部执行顺序读写。 在ZNS的场景下&#xff0c;不同应用按照Zone配置信息&#xff0c;相应存放业务数据。由于是Host管理数据的摆放和存取位置&#xff0c;会最大程度减少G…

山海鲸可视化软件:选择合适的图表,让数据可视化更高效

作为一名山海鲸可视化软件的开发者&#xff0c;我深知选择合适的图表对于数据可视化的重要性。下面我将从开发者的角度&#xff0c;分享一些关于如何选择合适可视图表的建议。 首先&#xff0c;我们需要明确数据可视化的目标。不同的图表类型具有不同的特点和适用场景&#xff…

数据结构:并查集的原理和运用

文章目录 什么是并查集&#xff1f;并查集的模拟实现并查集的应用省份数量等式方程的可满足性 本篇总结的是并查集的使用方法和运用 什么是并查集&#xff1f; 给定这样一个场景&#xff0c;n个不同的元素划分成不同的&#xff0c;不相交的集合&#xff0c;在开始的时候&…

JavaEE之多线程编程:2.创建线程及Thread类常见方法(超全!!!)

一、创建线程 Java中创建线程的写法有很多种&#xff01;&#xff01;&#xff01;这里介绍其中5种。 方法1&#xff1a;继承Thread类&#xff0c;重写run 创建一个类&#xff0c;让这个类继承自Thread父类&#xff0c;再重写我们的run方法就可以了。 使用Thread类&#xff…

文件批量管理方法:100个文件要怎样快速放在100个指定的文件夹中

处理大量文件时&#xff0c;经常要将多个文件放入相应的文件夹中。如果要处理的文件数量较大&#xff0c;例如100个文件要放入100个指定的文件夹中&#xff0c;那么如何快速有效地完成这个任务呢&#xff1f;下面看下云炫文件管理批量管理文件的方法&#xff0c;快速将100个文件…

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树 什么是二叉树&#xff1f; 二叉树是一种非线性数据结构&#xff0c;代表着祖先与后代之间的派生关系&#xff0c;体现着“一分为二”的分治逻辑。 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每…

jsonpath:使用Python处理JSON数据

使用Python处理JSON数据 25.1 JSON简介 25.1.1 什么是JSON JSON全称为JavaScript Object Notation&#xff0c;一般翻译为JS标记&#xff0c;是一种轻量级的数据交换格式。是基于ECMAScript的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清…

强化学习--背景

背景 强化学习 背景方向马尔可夫决策过程动态规划 方向 从数据中学习&#xff0c;或者从演示中学习包含丰富的门类&#xff0c;例如以模仿学习为代表的来自专家的数据中学习策略、以强化逆学习&#xff0c;代表来自数据中学习奖励函数以及来自人类反馈中学习&#xff0c;为代表…

大数据机器学习与深度学习—— 生成对抗网络(GAN)

GAN概述 在讲GAN之前&#xff0c;先讲一个小趣事&#xff0c;你知道GAN是怎么被发明的吗&#xff1f;据Ian Goodfellow自己说&#xff1a; 之前他一直在研究生成模型&#xff0c;可能是一时兴起&#xff0c;有一天他在酒吧喝酒时&#xff0c;在酒吧里跟朋友讨论起生成模型。然…

使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

Python 从入门到精通 学习笔记 Day04

Python 从入门到精通 第四天 今日目标 数据类型-又见str、数据类型-又见list 列表切片&排序&反转&循环、字典 数据类型 - 又见str 字符串定义 字符串是一个有序的字符的集合&#xff0c;用于在计算机里存储和表示文本信息 创建 a "Hello ,my name is Ha…

鸿蒙开发框架(ArkUI)简单解析

方舟开发框架&#xff08;简称ArkUI&#xff09;为HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面…

Jetson Xavier NX开发环境配置——编译libusb-1.0.9

背景 新买的Jetson Xavier NX 8G微雪的开发板&#xff0c;刷机后虽然已经带了libusb的库&#xff0c;在命令窗口输入lsusb也能够找到usb设备。但是&#xff0c;光机的usb配置说明中提示最好把老版本的libusb卸载掉&#xff0c;安装libusb-1.0.9版本&#xff0c;因此&#xff0…

【语义分割数据集】——imagenet语义分割

地址&#xff1a;https://github.com/LUSSeg/ImageNet-S 1 例图 2. 类别和数量信息 疑问 根据原文的描述&#xff1a;Based on the ImageNet dataset, we propose the ImageNet-S dataset with 1.2 million training images and 50k high-quality semantic segmentation annot…

【Vue第5章】vuex_Vue2

目录 5.1 理解vuex 5.1.1 vuex是什么 5.1.2 什么时候使用vuex 5.1.3 案例 5.1.4 vuex工作原理图 5.2 vuex核心概念和API 5.2.1 state 5.2.2 actions 5.2.3 mutations 5.2.4 getters 5.2.5 modules 5.3 笔记与代码 5.3.1 笔记 5.3.2 23_src_求和案例_纯vue版 5.3…