C语言自定义数据类型——联合体

2023-10-30

一 联合体

        1.定义

        联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

        2.类型声明:

union Un{

int i;
char c;
};

        注:每个成员之间仍是用分号隔开;联合体结束时不要忘加分号。 

3.联合体变量的创建

union Un{

char c;
int i;
};

int main(){

//联合体变量的创建
union Un u1;
printf("%d\n",sizeof(u1));
return 0;

    }

        代码讲解:在联合体类型中,char c占1字节,int i 占4字节,通过上面对联合体类型的定义可知:联合体成员变量是共用同一块内存。所以char占用的字节是int i 的第一字节,如下图:

所以u1的答案为4字节 。

二.联合的特点

        联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。

        通过以上对于联合体的了解,我们发现联合体与结构体struct 有很多相似的地方。结构体相当于独立的房子,其中的每个成员变量都是相互独立的,不会相互影响其他变量;而联合体相当于大学宿舍,四个人、六个人共住一样。

1.练习

union Un
{
 int i;
 char c;
};

int main(){
union Un un;
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
printf("%p\n", &u2);
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

}

            通过代码调试,我们发现,联合体本身大小和它的两个成员变量的地址都相同,更加具体的说明了联合体及其成员变量都是在同一地址开始使用内存 。

练习2.

union UN {
	int i;
	char j;
};

int main(){
    union UN u2;
    u2.i = 0x11223344;
	u2.j = 0x55;
    printf("%x\n", u2.i);
    	return 0;

}

解析:u2.j 是char型数据,将其赋值0x55,char型数据对于地址只能访问且修改一个字节
            因为是联合体成员,共用内存,所以也间接修改了i的低位地址
            0x11223344地址在VS中是以小端存储,为0x44 33 22 11(低地址向高地址)
            所以char u2.j会优先访问修改低位地址44,赋值55,变为0x55 33 22 11(小端存储模式)                所以最后的结果:u2.的地址为0x11223355     


三. 联合体大小的计算

        联合的大小至少是最大成员的大小。

        当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

        这个就涉及到了内存对齐,联合体的内存对齐规则与结构体的内存对齐规则相同,大家不懂内存对齐规则的可以看一看这篇博客,里面详细的讲到了结构体内存对齐的规则与方式:

 C语言结构体详解 (2) 结构体内存对齐,默认对齐数_

 

union Un1 {
 char c[5]; 
 int i; 
}; 

union Un2 {
 short c[7];
 int i;
 }; 

int main(){

 printf("%d\n", sizeof(union Un1));
 printf("%d\n", sizeof(union Un2));
    return 0;
}   

请问两个printf输出的结果是什么?

第一个联合体Un1的大小为8字节

第二个联合体Un2的大小为16字节 

        代码解析:在联合体Un1中,成员变量1是char arr[5],虽然它是个数组,但它的对齐数是按照char型来计算的,所以char arr[5]的对齐数为1 ,指针从偏移量0开始,为第一个成员变量开辟五个字节内存,之后指针指向偏移量为5的地址,而int i是整型,它的对齐数是4,因为是联合体,int i会与char arr[5] 共用前4个字节,接下来偏移量5不是联合体最大对齐数4的整数倍,指针需要向后跳转,直到偏移量为8的地址才符合要求,所以Un1的大小为8字节。结构图如下:

 

        代码解析2:在联合体Un2中,成员变量1仍然是个short型数组,成员变量1的对齐数为2,从偏移量0开始,向后开辟14个字节,之后指针指向偏移量为15的地址,int i因为联合体的原因与short数组共用前4个字节空间,此时,Int i 的对齐数4为联合体最大对齐数,偏移量15并不是4的整数倍,需要向后继续延申,直到偏移量16符合要求,所以联合体Un2的大小为16字节。

 

  

 好了,以上就是我对联合体概念的讲解,大家觉得有用的话点个一键三连吧,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言自定义数据类型——联合体 的相关文章

  • web下载七牛云上面的图片资源

    本文将怎么通过浏览器打包下载七牛云服务器上面的图片资源 如果不用压缩打包处理 可以直接获取流后用对应的out输出就行 不做具体解析 1 先讲怎么打包下载吧 ZipOutputStream我用的是这个工具类 创建 ZipOutputStrea
  • RL-RTX小读之os_sem_wait

    rtl h中定义了 define os sem wait sem tmo os sem wait U32 rt sem wait sem tmo rt sem wait的实现如下 OS RESULT rt sem wait OS ID se

随机推荐

  • for循环遍历列表的注意事项

    一图流
  • 环形链表

    LeetCode 环型链表 给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中没有环
  • 用 JavaScript,五分钟将 Siri 接入 ChatGPT(搬运)

    Siri ChatGPT 使用教程 将 Siri 接入 ChatGPT 直接语音唤醒 并且支持连续对话 第一步 拷贝项目 通过 AirCode 源码链接中右上角的 Get a copy 按钮快速生成一个自己的 AirCode Node js
  • 大数据技术原理与应用---笔记一:大数据概论

    大数据概论 1 大数据概念 1 1 4v说法 1 2 大数据的影响 对科学研究的影响 对思维方式影响 2 大数据相关技术 2 1大数据基本处理流程 3 大数据计算模式 大数据产业 参考书籍 1 大数据概念 1 1 4v说法 1 数据量大 v
  • 【华为上机真题】事件推送

    作者 Linux猿 简介 CSDN博客专家 华为云享专家 Linux C C 云计算 物联网 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 数据结构和算法成神路 精讲 优质好文持续更新中 欢迎小伙伴们点赞 收藏 留言 目录 一
  • 填速度环的大坑以及转向环的疑问还有对PID的魔性认识

    原文 https blog csdn net weixin 30836759 article details 94931014 前几天填补了速度环的大坑 之前速度环是每次获取编码器的返回值来对输出的PWM波进行赋值 发现车总是有气无力 更换
  • Spring Security+Spring Boot 无法访问静态资源 401-跨域问题解决

    401告诉我没有权限 一开始我还以为时静态资源没有开放 package cn hcnet2006 blog hcnetwebsite config import org springframework context annotation
  • java dispose - public void dispose()

    dispose public void dispose 释放由此 Window 其子组件及其拥有的所有子组件所使用的所有本机屏幕资源 即这些 Component 的资源将被破坏 它们使用的所有内存都将返回到操作系统 并将它们标记为不可显示
  • vue项目中如何定义 多个全局自定义指令

    在项目中如果自定义指令太多 不方便在main js中写 那么如何能够全部写在一个文件然后在main js中引入 首先创建一个js文件 用于专门书写指令 directives index js export const imagerror i
  • signed和unsigned区别

    signed和unsigned用于修饰整数类型 包括char 从ANSI C89标准开始支持 signed表示有符号 unsigned表示无符号 有符号数的最大取值要比无符号的小约一半 因为有符号数的最高一位被用来表示符号 默认的int s
  • 剑指offer 专项突破版 119、最长连续序列

    题目链接 思路 同样的可以转化为并查集来做 可以把相邻的数字放到一个子集中 每当搜索到一个数字时就判断和他相邻的数字是否在集合中 如果在就合并 为了方便记录每个集合的大小 可以用一个count集合记录每个子集的大小 在合并集合的时候也要更新
  • vue开发环境准备-  配置npm私服地址

    1 通过config命令 npm config set registry https ip repository npm group 2 命令行方式 npm registry https ip repository npm group in
  • 剑指offer—16.数值的整数次方——分析及代码(Java)

    剑指offer 16 数值的整数次方 分析及代码 Java 一 题目 二 分析及代码 1 二分求解 1 思路 2 代码 3 结果 三 其他 一 题目 给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent
  • 微信小程序监听返回后执行操作

    例如 点击主页面是index进入子页面list list页面onUnload进行监听 onUnload getCurrentPages 获取当前的页面栈 var pageList getCurrentPages var prevPage p
  • Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架 你可以直接使用它来管理你的缓存 Spring 提供了对缓存功能的抽象 即允许绑定不同的缓存解决方案 如Ehcache 但本身不直接提供缓存功能的实现 它支持注解方式使用缓存 非常方便 本文先通过E
  • R 与甲骨文数据挖掘

    特点 使用 Oracle Data Miner 和 Oracle R Enterprise 自动化预测分析过程 深入了解企业中常用的各种统计模型 以及如何使用各种 SQL PLSQL ORE ODM 和本机 R 包将它们自动化以进行预测分析
  • MD5

    package com bochy md5 import java security MessageDigest import java security NoSuchAlgorithmException import com sun ma
  • Linux基础——sudo命令

    sudo 用户提升权限的命令 1 新建用户 并且设置密码 root sanchuang useradd panlinfeng root sanchuang echo 123456 passwd panlinfeng stdin 更改用户 p
  • 爱立信携手河北移动护航张家口"雪如意"国际赛事;亚马逊云科技宣布1000万美元教育和奖学金计划

    国内市场 爱立信携手河北移动护航 雪如意 国际赛事 其中 爱立信与河北移动共同探讨 并采用了 2 6G 4 9G载波聚合功能 该功能可对张家口赛区现有核心赛区热点区域的网络进行整合服用 将下行峰值速率提升至3Gbps以上 让网络吞吐率实现了
  • C语言自定义数据类型——联合体

    一 联合体 1 定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员 特征是这些成员公用同一块空间 所以联合也叫共用体 2 类型声明 union Un int i char c 注 每个成员之间仍是用分号隔开 联合体结束