C语言——联合体类型

📝前言:
在前面两篇文章:C语言——结构体类型(一)和C语言——结构体(二)中,我们讲述了C语言中重要的数据类型之一:结构体类型,今天我们来介绍一下C语言中的另一种数据类型:联合体类型
我会从以下几个方面进行讲解:
1,什么是联合体
2,联合体的声明
3,联合体的特点
4,联合体大小

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:但凡不能杀死你的,最终都会使你更强大


文章目录

  • 一,什么是联合体
  • 二,联合体的声明
    • 1,联合体类型的声明
    • 2,联合体变量的创建
  • 三,联合体的特点
    • 1,联合体与结构体的对比
    • 2,对联合体成员进行改变
  • 四,联合体的大小

一,什么是联合体

联合体也称共用体
像结构体一样,联合体也是由一个或者多个成员构成,这些成员的类型可以不同。但是,与结构体不同的是:联合体的所有成员共用一块内存空间。(即:给联合体其中的一个成员赋值,其他成员的值也会跟着被改变)

二,联合体的声明

1,联合体类型的声明

C语言中联合体类型的定义形式:
union 联合体名
{
成员项表列
};

例如:
(我们定义一个同时由char和int型构成的联合体)

union Un
{char c;int i;
}; (注意:分号不能丢)

2,联合体变量的创建

同结构体变量的创建类似,我们可以在声明联合体类型的同时创建变量;也可以在声明后,再创建变量
如:
(1)先声明联合体类型,再创建变量

#include<stdio.h>
union Un
{char c;int i;
};
union Un u1;

(2)在声明联合体类型的同时创建变量

union Un
{char c;int i;
}u1;

对联合体成员的引用也与对结构体成员的引用相同

三,联合体的特点

1,联合体与结构体的对比

联合体的大部分与结构体相似,其独特之处就是所有成员共用一块内存空间
例如,我们看拥有相同成员的结构体和联合体对比:
在这里插入图片描述

对于s1 和 u1的内存分配情况应该是:
在这里插入图片描述
我们可以用sizeof算一算,看看结果:
运行下面代码:

int main()
{printf("%d\n", sizeof(s1));printf("%d\n", sizeof(u1));return 0;
}

输出:

这里是引用
可以发现:和我们上面的分析一样

2,对联合体成员进行改变

下面我们就对联合体u1中的成员c进行赋值,然后再打印成员i

#include<stdio.h>
union Un
{char c;int i;
}u1;
int main()
{u1.c = 1;printf("%d", u1.i);return 0;
}

运行结果:
在这里插入图片描述
可见:尽管没有给成员i赋值,但是随着成员c被修改成员i的值也发生了变化

四,联合体的大小

上面提到的联合体u1的大小是4,刚好是当中最大的int类型的大小,难道联合体的大小就是其中最大成员的大小吗?
答案是:错误的
因为联合体的大小也要满足是最大对齐数的整数倍

⭐换句话来说,联合体的大小要满足以下两个条件:
1,大于或等于最大的成员(至少要能装下最大的成员)
2,同时是最大对齐数的整数倍

对于上面的u1
最大成员:int类型的大小是4
int的最大对齐数也是4,所以联合体u1的大小是4

再看下面的代码(多加一个字符数组):

#include<stdio.h>
union Un
{char c;int i;char arr[6];
}u1;
int main()
{u1.c = 1;printf("%d",sizeof(u1));return 0;
}

运行结果:
在这里插入图片描述
这是因为:
1,最大成员char arr[6]的大小是6
2,最大对齐数是4
6不是4的倍数,所以扩宽到8,所以联合体的大小是8


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

opencv0014 索贝尔(sobel)算子

前面学习的滤波器主要是用来模糊图像&#xff0c;今天一起来了解关于边缘识别的滤波吧&#xff01;嘿嘿 边缘 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取&#xff0c;对象检测&#xff0c;模式识别等方面都有重要的作用。 人眼如…

Webstorm安装了vue脚手架后终端输入vue报错解决方法

当我们初学Vue的时候&#xff0c;刚安装完Vue脚手架之后&#xff0c;输入vue报错&#xff0c;是因为webstorm终端受限制了。 vue: 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。 解决方案如下&#xff1a; 通过…

C#,纽曼-尚克斯-威廉士素数(Newman Shanks Williams prime)的算法与源代码

1 NSW素数 素数是纽曼-尚克斯-威廉士素数&#xff08;Newman-Shanks-Williams prime&#xff0c;简写为NSW素数&#xff09;当且仅当它能写成以下的形式&#xff1a; 1981年M. Newman、D. Shanks和H. C. Williams在研究有限集合时&#xff0c;率先描述了NSW素数。 首几个NSW素…

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动 在用Allegro进行PCB设计时,有时候需要同时移动某个区域的所有元素,如:Symbols,shapes,vias,Clines,Cline segs等元素。那么如何操作呢? 首先就是把Symbols,shapes,vias,Clines,Cline …

跑马灯(极简版)

主要参数 behavior&#xff1a;设定滚动的方式 alternate&#xff1a; 表示在两端之间来回滚动。scroll&#xff1a; 表示由一端滚动到另一端&#xff0c;会重复。slide&#xff1a; 表示由一端滚动到另一端&#xff0c;不会重复。 direction&#xff1a;设定活动字幕的滚动…

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者&#xff1a;来自 Jessica Garson 大约一年前&#xff0c;我经历了一段压力很大的时期&#xff0c;最后参加了一场篮球比赛。 在整个过程中&#xff0c;我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决

ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…

【学网攻】 第(22)节 -- DHCP中继配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP中继是什么&#xff1f; 二、实验 1.引入 实验目的理解DHCP中继的功能&#xff1b; 实验背景 实验步骤新建Packet Tracer拓扑图 实验设备PC 2台&#xff1b;Server-PT(Web服务器) &#xff0c;Switch_2950-24 …

Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)

文章目录 概要一、I/O基础二、阻塞式I/O三、非阻塞式I/O三、I/O多路复用四、信号驱动I/O五、异步I/O六、小结 概要 在工作中&#xff0c;经常使用Nginx、Redis等开源组件&#xff0c;常提到其高性能的原因是网络I/O的实现是基于epoll&#xff08;多路复用&#xff09;。这次呢…

白酒:新型发酵技术的研究与探索

在白酒酿造过程中&#xff0c;发酵技术是至关重要的环节。云仓酒庄的豪迈白酒在生产过程中&#xff0c;不断研究和探索新型发酵技术&#xff0c;以提升酒的品质和口感。 首先&#xff0c;新型发酵技术有助于提高酒的香气和口感。通过改进发酵工艺和方法&#xff0c;酒庄能够获得…

流式 dbt:RisingWave 流计算的正确打开方式

让我们先来看一则 Reddit 经典提问&#xff1a; “为啥 dbt 如此流行&#xff1f;有没有替代品&#xff1f;” 获赞最多的回答抓住了精髓&#xff1a; “dbt 这么流行是因为它为 SQL 分析师和数据集市构建者提供了 Git 工作流&#xff0c;使得他们可以跟其他软件工程师一样工作…