C语言菜鸟入门·关键字·union的用法
目录
1. 简介
2. 访问成员
2.1 声明
2.2 赋值
3. 共用体的大小
4. 与typedef联合使用
5. 更多关键字
1. 简介
共用体(union)是一种数据结构,它允许在同一内存位置存储不同的数据类型,但每次只能存储其中一种类型的数据。与结构体不同,结构体中的每个成员都有各自独立的内存空间,而共用体中的所有成员共享同一块内存区域。
表达形式:
union union_name {data_type1 member1;data_type2 member2;data_type3 member3;// 其他成员
};
- union_name 是共用体的名称。
- member1, member2, member3 是共用体的成员。
- data_type1, data_type2, data_type3 是成员的类型。
举例:
union Data {int i;float f;char str[20];
};
2. 访问成员
2.1 声明
访问共用体的成员与结构体类似,通过点操作符 (.) 来访问共用体的各个成员。每次只能访问共用体中的一个成员。
我们先声明一个共用体:
union Data
{char data1;int data2;float data3;double data4; char str[20];
};
在定义一个共用体变量,通过改变了来访问共用体成员:
union Data sum;
合起来就是:
union Data
{char data1;int data2;float data3;double data4; char str[20];
};union Data sum;
简化形式:
union Data
{char data1;int data2;float data3;double data4; char str[20];
}sum;
匿名结构:
union
{char data1;int data2;float data3;double data4; char str[20];
}sum;
2.2 赋值
下面我们只对data1,进行赋值看看是什么结果:
#include <stdio.h>union Data {char data1; // char 类型int data2; // int 类型float data3; // float 类型double data4; // double 类型char str[20]; // 字符数组
}sum;int main() {// 1. 为 data1 赋值sum.data1 = 'A';printf("data1: %c\n", sum.data1); printf("data2: %d\n", sum.data2); printf("data3: %f\n", sum.data3); printf("data4: %lf\n", sum.data4); printf("str: %s\n", sum.str);return 0;
}
可以看到所有共用体介能打印出data1的数据,说明他们共用一个内存空间:
下面我们对data2进行赋值,看看是什么结果:
#include <stdio.h>union Data {char data1; // char 类型int data2; // int 类型float data3; // float 类型double data4; // double 类型char str[20]; // 字符数组
}sum;int main() {// 1. 为 data1 赋值sum.data1 = 'A';printf("data1: %c\n", sum.data1); printf("data2: %d\n", sum.data2); printf("data3: %f\n", sum.data3); printf("data4: %lf\n", sum.data4); printf("str: %s\n", sum.str);printf("------------------------------------\n");printf("\n");printf("\n");printf("\n");// 2. 为 data2 赋值,覆盖了 data1 的值sum.data2 = 12345;printf("data1: %c\n", sum.data1); printf("data2: %d\n", sum.data2); printf("data3: %f\n", sum.data3); printf("data4: %lf\n", sum.data4); printf("str: %s\n", sum.str);return 0;
}
可以看到值被覆盖掉了:
我们换一种表达方式:
#include <stdio.h>union Data {char str[4]; int data1;
}sum;int main() {sum.str[0] = 0x12; sum.str[1] = 0x34; sum.str[2] = 0x56; sum.str[3] = 0x78; printf("str: %x\n", sum.str[0]);printf("str: %x\n", sum.str[1]);printf("str: %x\n", sum.str[2]);printf("str: %x\n", sum.str[3]);printf("data1: %x\n", sum.data1); printf("--------------------------------\n");printf("\n");printf("\n");printf("\n");sum.data1 = 0x12345678;printf("str: %x\n", sum.str[0]);printf("str: %x\n", sum.str[1]);printf("str: %x\n", sum.str[2]);printf("str: %x\n", sum.str[3]);printf("data1: %x\n", sum.data1); return 0;
}
会发现给数组赋值时,data1也会有数据显示,给data1赋值时,数组的数据会被覆盖掉:
除此之外我们会发现,我们明明赋值赋的是12345678,但是为什么数组显示是str[0]=0x78,那是因为采用的小端模式。
大端模式(高字节在前) | 小端模式(低字节在前) | |||||||
data1 | str[0] | str[1] | str[2] | str[3] | str[0] | str[1] | str[2] | str[3] |
0x12345678 | 0x12 | 0x34 | 0x56 | 0x78 | 0x12 | 0x34 | 0x56 | 0x78 |
3. 共用体的大小
共用体的大小是其最大成员的大小,因为所有成员共享同一块内存空间。也就是说,尽管共用体可以包含多个成员,但内存只为其中最大的数据类型分配。
例如,如果一个共用体包含一个 int(4字节)和一个 double(8字节),那么这个共用体的大小将是 8 字节,因为 double 占用的空间较大。
#include <stdio.h>union Data
{char data1;int data2;float data3;double data4; };union Data sum;int main()
{printf("data1占用的%d字节\n",sizeof(sum.data1));printf("data2占用的%d字节\n",sizeof(sum.data2));printf("data3占用的%d字节\n",sizeof(sum.data3));printf("data4占用的%d字节\n",sizeof(sum.data4));printf("共用体占用的%d字节\n",sizeof(sum));return 0;
}
4. 与typedef联合使用
我们对共用体 union un 重定义为 u ,并通过 u 声明变量共用体变量 data2 并进行初始化。
#include<stdio.h>union un
{char data1;int data2;
};typedef union un u;int main()
{u data2 = { 0 };data2.data1 = 'a';printf("%d", data2.data2);return 0;
}
也可以写作:
#include<stdio.h>typedef union un
{char data1;int data2;
}u;int main()
{u data2 = { 0 };data2.data1 = 'a';printf("%d", data2.data2);return 0;
}
匿名形式:
#include<stdio.h>typedef union
{char data1;int data2;
}u;int main()
{u data2 = { 0 };data2.data1 = 'a';printf("%d", data2.data2);return 0;
}
5. 更多关键字
C语言32个关键字 | 跳转链接 | |||
第一类:数据类型关键字 | A基本数据类型(5个) | void | 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 | C语言菜鸟入门·关键字·void的用法-CSDN博客 |
char | 字符型类型数据,属于整型数据的一种。 | C语言菜鸟入门·关键字·char关键字-CSDN博客 | ||
int | 整型数据,通常为编译器指定的机器字长。 | C语言菜鸟入门·关键字·int的用法-CSDN博客 | ||
float | 单精度浮点型数据,属于浮点数据的一种,小数点后保存6位。 | C语言菜鸟入门·关键字·float以及double的用法-CSDN博客 | ||
double | 双精度浮点型数据,属于浮点数据的一种,比float保存的精度高,小数点后保存15/16位。 | |||
B类型修饰关键字(4个) | short | 修饰int,短整型数据,可省略被修饰的int。 | C语言菜鸟入门·关键字·修饰关键字short、long、signed、unsigne详细-CSDN博客 | |
long | 修饰int,长整形数据,可省略被修饰的int。 | |||
signed | 修饰整型数据,有符号数据类型。 | |||
unsigne | 修饰整型数据,无符号数据类型。 | |||
C复杂类型关键字(5个) | struct | 结构体声明。 | C语言菜鸟入门·结构体·struct用法超详细解析_struct在c语言中用法-CSDN博客 | |
union | 共用体声明。 | C语言菜鸟入门·关键字·union的用法-CSDN博客 | ||
enum | 枚举声明。 | C语言菜鸟入门·枚举类型·enum的使用详解-CSDN博客 | ||
typedef | 声明类型别名。 | C语言菜鸟入门·各种typedef用法超详细解析-CSDN博客 | ||
sizeof | 得到特定类型或特定类型变量的大小。 | C语言菜鸟入门·关键字·sizeof的用法-CSDN博客 | ||
D存储级别关键字(6个) | auto | 指定为自动变量,由编译器自动分配及释放。通常在栈上分配。 | C语言菜鸟入门·关键字·auto的用法、register的用法-CSDN博客 | |
static | 指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。 | |||
register | 指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。 | C语言菜鸟入门·关键字·auto的用法、register的用法-CSDN博客 | ||
extern | 指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定由另外文件声明的。 | |||
const | 与volatile合称“cv特性”,指定变量不可被当前线程/进程改变 | C语言菜鸟入门·关键字·const的用法、volatile的用法-CSDN博客 | ||
volatile | 与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值。 | |||
第二类:流程控制关键 字 | A跳转结构(4个) | return | 用在函数体中,返回特定值(或者是void值,即不返回值)。 | |
continu | 结束当前循环,开始下一轮循环。 | |||
break | 跳出当前循环或switch结构。 | |||
goto | 无条件跳转语句。 | |||
分支结构(5个) | if | 条件语句。 | C语言菜鸟入门·判断语句(if语句、if...else语句、嵌套if语句)详细介绍_c语言else if-CSDN博客 | |
else | 条件语句否定分支(与if连用)。 | |||
switch | 开关语句(多重分支语句)。 | |||
case | 开关语句中的分支标记。 | |||
default | 开关语句中的“其他”分治,可选。 | |||
C循环结构(3个) | for | or循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件。 | ||
do | do循环结构,do 1 while(2);的执行顺序是1->2->1...循环,2为循环条件。 | |||
while | while循环结构,while(1) 2;的执行顺序是1->2->1...循环,1为循环条件,以上循环语句,当循环条件 表达式为真则继续循环,为假则跳出循环。 |
关键字_时光の尘的博客-CSDN博客
相关文章:

C语言菜鸟入门·关键字·union的用法
目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体(union)是一种数据结构,它允许在同一内存位置存储不同的数据类型,但每次只能存储其中一种类型的…...

ensp静态路由实验
一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求: 根据要求利用现有实验设备组建小型局域网 实验设备: 交换机S37002台;PC机2台;路由器2台。 …...

构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
第 1 部分:环境设置 安装 Java Development Kit (JDK):下载并安装 JDK。设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。安装数据库:下载并安装 MySQL 数据库。配置数据库:创建数据库…...

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法
mfc100u.dll 是一个动态链接库(DLL)文件,属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义,这…...
Java面试之多线程并发篇
前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说一说自己对于 synchronized 关键字的了解?说说自己是怎么使用 synchronized 关键字?什么是线程安全?Vector是一个线程安全类吗?…...

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析
在数字科技日新月异的今天,视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台,提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务,广泛应用于…...

安全加固方案
交换机安全加固 查看是否关闭未使用的接口 25GE1/0/1、25GE1/0/47、25GE1/0/48需要使用,暂不关闭 system-view # interface Eth-Trunk99 shutdown quit interface Eth-Trunk100 shutdown quit interface Eth-Trunk110 shutdown quit interface 25GE1/…...
Linux firewall防火墙规则
官网 https://firewalld.org/ 查看所有防火墙规则: firewall-cmd --list-all-zones查看当前区域防火墙规则: firewall-cmd --list-all添加一个开放服务规则: firewall-cmd --add-servicessh删除一个开放服务规则: firewall-cmd…...
速盾:CDN缓存的工作原理是什么?
CDN(内容分发网络)是一种将内容分发到全球不同地理位置的网络架构,以提供更快速、可靠的内容传输。其核心原理是利用缓存技术,将数据内容分布到离用户最近的边缘节点上。当用户请求内容时,CDN将根据用户的IP地址&#…...

日常开发记录-正确的prop传参,reduce搭配promise的使用
日常开发记录-正确的prop传参,reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…...

Hyper-V配置-cnblog
启用Hyper-V以在 Windows 10上创建虚拟机 (1)控制面板检查系统要求: 确保您的计算机符合 Hyper-V 的系统要求。通常情况下,您的计算机需要运行 Windows 10 专业版、企业版或教育版,并且具有启用了虚拟化技术的处理器。…...

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…...

openssl颁发包含主题替代名的证书–SAN
原文地址:openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中,commonName(CN)字段只能有一个值。如果让证书支持多个域名和IP地址,…...
Stable Diffusion入门教程
要入门Stable Diffusion,你可以按照以下步骤进行: 1. 安装Stable Diffusion 获取安装包:你可以从GitHub上的 Stable Diffusion Web UI开源地址获取安装包。 一键启动程序包:如果你是小白不会装,可以使用国内秋葉aaaki开…...

H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
conan2 c/c++包管理入门之--------------------------conanfile.py
书接上回,用过使用cmake去手动指定CMAKE_TOOLCHAINE_FILE和CMAKE_BUILD_TYPE太麻烦,有没有更简单的办法了,经过我的大量探索下终于发现,使用conan build和conanfile.py。大致原理是conan在构建时会自动调用conanfile.py里面定义数据和函数。举个例子: from conan import …...

DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?
概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…...

重新定义社媒引流:AI社媒引流王如何为品牌赋能?
在社交媒体高度竞争的时代,引流已经不再是单纯追求流量的数字游戏,而是要找到“对的用户”,并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略,重新定义了社媒引流的方式,帮助品牌在精准触达和高效互动中脱…...

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register
0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…...

《硬件架构的艺术》笔记(五):低功耗设计
介绍 能量以热量形式消耗,温度升高芯片失效率也会增加,增加散热片或风扇会增加整体重量和成本,在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支,产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...