【C语言】共用体union

【C语言】共用体union:

  • 也称联合体。同一个内存空间用于多个数据的存储。
  • 同一时间只能存储一个成员数据。
  • 使用内存覆盖技术。新的成员数据会覆盖原来的成员数据。
  • 内存大小是最大的成员占用内存大小,且是最大对齐数的整数倍,若不足整数倍,将填充字节补齐。

1、定义共用体类型

  • 关键字union。
  • 包括共用体名、共用体成员。共用体成员由成员类型、成员变量名组成。
  • 最后末尾的分号";"不能省略。
// 定义名为person的共用体,成员有字符串name,整数int,字符串指针job
union person
{char name[20];int age;char *job;
};

2、共用体变量

(2-1)定义共用体变量

  • 定义共用体类型后,定义共用体变量。可以定义一个或多个共用体变量。
union person
{char name[20];int age;char *job;
};union person p1;             // 定义一个共用体变量
union person p1, p2, p3;     // 定义多个共用体变量
  • 定义共用体类型时,同时定义共用体变量。可以定义一个或多个共用体变量。
union person
{char name[20];int age;char *job;
} p;                     // 定义共用体类型时,定义一个共用体变量union person
{char name[20];int age;char *job;
} p1, p2, p3;            // 定义共用体类型时,定义多个共用体变量

(2-2)访问共用体成员

  • 使用成员访问运算符(".")来访问共用体的成员。
#include <stdio.h>
#include <string.h>union person
{char name[20];int age;char *job;
};int main(void)
{union person p;strcpy(p.name, "John");           // 成员name的值为Johnp.age = 18;                       // 成员age的值覆盖原来成员name的值  p.job = "programer";              // 成员job的值覆盖原来成员age的值printf("p.name is %s\n", p.name);printf("p.age is %d\n", p.age);printf("p.job is %s\n", p.job);return 0;
}// 结果:
p.name is                            // 数据被新数据覆盖,该数据已损坏
p.age is 4210688                     // 数据被新数据覆盖,该数据已损坏
p.job is programer                   // 最后的数据占据内存
  •  若是指针,使用箭头运算符("->")来访问共用体的成员。
#include <stdio.h>
#include <string.h>union person
{char name[20];int age;char *job;
};int main(void)
{union person *p, p1;p = &p1;                           // 指针p指向共用体p1strcpy(p->name, "John");           // 成员name的值为Johnp->age = 18;                       // 成员age的值覆盖原来成员name的值  p->job = "programer";              // 成员job的值覆盖原来成员age的值printf("p point to p1, name is %s\n", p->name);printf("p point to p1, age is %d\n", p->age);printf("p point to p1, job is %s\n", p->job);return 0;
}// 结果:
p point to p1, name is                // 数据被新数据覆盖,该数据已损坏
p point to p1, age is 4210688         // 数据被新数据覆盖,该数据已损坏
p point to p1, job is programer       // 最后的数据占据内存

3、共用体大小:

  • 共用体的内存大小是最大的成员占用内存大小。
  • 共用体的内存大小是最大对齐数的整数倍,若不足整数倍,将填充字节补齐。
#include <stdio.h>union person
{char name[20];        // 字符串name:20字节int age;              // 整数int:4字节char *job;            // 字符串指针job:8字节(64位的计算机)
};int main(void)
{union person p;printf("p memory size is %d bytes\n", sizeof(p));return 0;
}// 结果:
p memory size is 24 bytes    //最大成员内存大小为20,不足最大对齐数的整数倍,填充字节补齐

4、共用体作为结构体的成员

注:数组名就是内存地址(数组第一个元素的内存地址)。整数的内存地址需用&获取(&整数变量名)。

字符数组通常用于表示字符串。字符串名也是内存地址(字符串第一个元素的内存地址)。

#include <stdio.h>
#include <string.h>struct person                 // 结构体
{char name[20];int age;char job[16];union                     // 共用体, language或者place,只能提供一个数据{char language[16];char place[16];}lp;                      // 共用体变量名lp
}p[2];                        // 结构体数组pint main(void)
{// 根据用户输入,写入数据for(int i = 0; i < 2; i++){printf("[ Input ]name age job (NO.%d): ", i+1);scanf("%s %d %s", p[i].name, &p[i].age, p[i].job);// 如果job是programmer,则提供language,否则提供placeif(strcmp(p[i].job, "programmer") == 0){printf("Input language: ");scanf("%s", p[i].lp.language);}else{printf("Input place: ");scanf("%s", p[i].lp.place);}}// 输出数据for(int i = 0; i < 2; i++){if(strcmp(p[i].job, "programmer") == 0)printf("%s, %d, %s, %s\n", p[i].name, p[i].age, p[i].job, p[i].lp.language);elseprintf("%s, %d, %s, %s\n", p[i].name, p[i].age, p[i].job, p[i].lp.place);}return 0;
}// 结果:
[ Input ]name age job (NO.1): John 18 programmer        【输入:John 18 programmer】
Input language: C                                       【输入:C】
[ Input ]name age job (NO.2): Mark 25 teacher           【输入:Mark 25 teacher】
Input place: Beijing                                    【输入:Beijing】
John, 18, programmer, C
Mark, 25, teacher, Beijing

5、共用体与结构体的主要区别

共用体结构体
各成员在相同的内存位置各成员在不同的内存位置
同一时间只能存储一个成员数据同一时间可以存储多个不同类型的成员数据
新的成员数据会覆盖原来的成员数据各成员的数据互不影响
内存大小 >= 最大的成员内存大小内存大小 >= 各成员内存大小之和
关键字union关键字struct

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

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

相关文章

sql基础语法

sql基础语法 1. 什么是MySQL1.1 RDBMS 特点1.2 sql分类1.3 数据类型1.4 适应MySQL 2. 代码顺序与后台执行顺序2.1 代码撰写顺序2.2 后台执行顺序 3. 基础查询4. 条件检索5. 分组6. 多表查询6.1 子查询&#xff08;几乎不用&#xff09;6.2 连接查询 7. 常用函数 前同事培训过相…

GitHub 仓库 (repository) Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub 仓库 [repository] Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clo…

前端处理axios请求下载后端返回的文件流

需求&#xff1a;点击按钮下载文件&#xff0c;请求后端接口&#xff0c;后端返回文件流&#xff0c;如果遇到错误信息并不能简单的res.message拿到错误提示&#xff0c;而且想要正常下载前端也需要做些处理。 1.请求接口要加上响应类型为blob&#xff0c; responseType: ‘blo…

FreeGPT3.5 开源软件

GPT-3.5不需要付费&#xff0c;也不需要注册用户&#xff0c;可以直接使用了&#xff0c;官方彻底开放了API接口。 该API政策一放开&#xff0c;GitHub很快就已经出现了一个开源项目FreeGPT35&#xff0c;可以自动生成key调用GPT3.5的API接口&#xff0c;再也用不着注册账号和申…

服务器数据恢复—V7000存储raid5数据恢复案例

服务器数据恢复环境&#xff1a; P740AIXSybaseV7000存储阵列柜&#xff0c;阵列柜上有12块SAS机械硬盘&#xff08;包括1块热备盘&#xff09;。 服务器故障&#xff1a; 管理员在日常巡检过程中发现阵列柜中有一块磁盘发生故障&#xff0c;于是更换磁盘并同步数据&#xff0…

二分法(蓝桥杯Python组)

二分法 二分法(Binary Search)主要用于在有序数组中搜索恰好满足某一边界条件的元素。如果题目所求的答案具有是或者不是两种状态&#xff0c;则说明其可能是二分法的题目。同时还需要注意蓝桥杯通常不会直接出题考察二分法&#xff0c;而是将其内嵌到其他算法中联合考察&#…

kafka客户端常用命令

kafka-topics.sh 相关的命令 Command Usage: create: enable rack strategy: kafka-topics.sh --create --topic --partitions <Integer: the number of partitions> --replication-factor <Integer: replication factor> --zookeeper <ZK_IP1:ZK_PORT,ZK_IP2:…

快速熟悉torchdiffeq用法,从数理逻辑到完整案例【第二部分】

本系列文章板块规划 提示&#xff1a;以下内容仅为个人学习感悟&#xff0c;无法保证完全的正确和权威&#xff0c;大家酌情食用谢谢。 第一部分 torchdiffeq背后的数理逻辑 第二部分 torchdiffeq的基本用法 第三部分 trochdiffeq的升级用法 第四部分 torchdifffeq的案例和代码…

C++11:function包装器

包装器&#xff0c;体现了C11中的封装性&#xff0c;包装器可以应用于&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda 而包装器function的出现刚好也弥补了上述三种语法的不足之处 函数指针写起来较为复杂&#xff0c;而仿函数之间类型不同&#xff0c;lambda则在…

数学建模笔记(10)整数规划和0-1规划

前由 显然通关次数不能是小数&#xff0c;这就涉及到了整数问题。 定义 例题

最新mysql8.3 保姆级 主从复制搭建教程

mysql 主从复制搭建 服务器配置表 机器ip操作系统主机192.168.31.25华为openEuler-22.03-LTS-SP3从机192.168.31.184华为openEuler-22.03-LTS-SP3从机192.168.31.228华为openEuler-22.03-LTS-SP3 1、在3台机器上安装独立的 mysql 1.1 创建myql文件夹用来存放mysql包 mkdir…

python-可视化篇-turtle-画爱心

文章目录 原效果替换关键字5为8&#xff0c;看看效果改下颜色 原效果 import turtle as tt.color(red,pink) t.begin_fill() t.width(5) t.left(135) t.fd(100) t.right(180) t.circle(50,-180) t.left(90) t.circle(50,-180) t.right(180) t.fd(100) t.pu() t.goto(50,-30) t…

开发语言漫谈-C#

C#的#&#xff0c;字面上的意思就是&#xff0c;也就是把C再。微软只所以搞C#就是要抗衡Java。微软当时搞了个J&#xff0c;被Java告了&#xff0c;没办法了只能另取炉灶。从纯技术角度来看&#xff0c;C#设计非常优秀&#xff0c;可以覆盖所有领域&#xff0c;是几乎唯一的全栈…

【用户案例】太美医疗基于Apache DolphinScheduler的应用实践

大家好&#xff0c;我叫杨佳豪&#xff0c;来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分&#xff1a; 使用历程及选择理由稳定性的改造功能定制与自动化部署运维巡检与优化 使用历程及选择理由 公司介绍 …

.Net <% %>

<% %> 语法 : <% import namespace"system.data"%> 用来导入后台命名空间 指令用于指定当页和用户控件编译器处理 ASP.NET Web 窗体页 (.aspx) 和用户控件 (.ascx) 文件时所使用的设置。<% %> 语法 : <% name %> <% getstr() %&g…

修改el-button按钮背景色后,按钮失去了elementUI原有的hover和active的效果

应完整修改为&#xff1a; <el-button type"primary" icon"el-icon-plus" click"addUser">新增用户</el-button>.el-button--primary:not(.is-disabled) {background-color: #1174de;border-color: #1174de;&:hover {&:not…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型&#xff0c;使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重&#xff1a;2B和7B。每种尺寸都带有经过预训练&a…

【iOS ARKit】AR Quick Look 概述

为更好地传播共享 AR 体验&#xff0c;苹果公司引入了 AR Quick Look&#xff0c;并在iOS 12及以上版本系统中深度集成了 AR Quick Look&#xff0c;因此可以通过iMessage、Mail、Notes、 News、 Safari 和 Files 直接体验 AR&#xff0c;AR Quick Look提供了在 iPhone 和iPad …

排序算法,插入排序

插入排序是什么 插入排序&#xff08;Insertion Sort&#xff09;&#xff0c;一般也被称为直接插入排序。对于少量元素的排序&#xff0c;它是一个有效、简单的算法 其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中&#xff0c;最终得到的序列就是已经排…

使用opencv + ffmpeg 开发视频播放器Demo

使用opencv ffmpeg 开发视频播放器Demo #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/videoio.hpp>extern "C" { #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #includ…