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,那是因为采用的小端模式。

大端模式(高字节在前)小端模式(低字节在前)
data1str[0]str[1]str[2]str[3]str[0]str[1]str[2]str[3]
0x123456780x120x340x560x780x120x340x560x78

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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话&#xff0c;我们开发驱动时需要先…

低代码搭建crm系统实现财务管理功能模块

实例背景&#xff1a; CRM的项目&#xff0c;客户想要实现一个简单的财务记账功能&#xff0c;记录订单应收账款及收款记录。 具体要求&#xff1a; 1、要求收款时可以实时计算本次收款后的剩余应收。 2、要求记录AR的收款状态&#xff1a;未收款、部分收款、已收款。 实现…

C51相关实验

C51相关实验 LED //功能&#xff1a;1.让开发板的LED全亮&#xff0c;2,点亮某一个LED,3.让LED3以5Hz的频率闪动#include "reg52.h"#define LED P2 sbit led1 LED^1;void main(void) {LED 0xff;//LED全灭led1 0;while(1)//保持应用程序不退出{} }LED 输出端是高…

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…

虚拟机CentOS系统通过Docker部署RSSHub并映射到主机

公告 &#x1f4cc;更新公告 20241124-该文章已同步更新到作者的个人博客&#xff08;链接&#xff1a;虚拟机CentOS系统通过Docker部署RSSHub并映射到主机&#xff09; 一、编辑 YUM 配置文件 1、打开 CentOS 系统中的 YUM 软件仓库配置文件 vim /etc/yum.repos.d/CentOS-Ba…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

远程控制软件:探究云计算和人工智能的融合

在数字化时代&#xff0c;远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机&#xff0c;极大地提升了工作效率和便捷性。随着人工智能&#xff08;AI&#xff09;和云计算技术的飞速发展&#xff0c;远程控制工具也迎来了新的发展机遇…

漫谈 module caching——PyCharm jupyter notebook 在导入模块被更新后无法及时同步问题

目录 引子&#xff1a;问题的发现何为 module caching见微知著&#xff1a;Python 中的缓存机制参考链接 引子&#xff1a;问题的发现 近日笔者用 PyCharm 创建了一个项目时不经意间发现了这个问题&#xff1a;事情发生在调试 Jupyter Notebook 的过程中。当笔者修改了自己编写…

企业数字化转型现状

国家数字经济战略背景 2018年以来&#xff0c;国家政府不断出台政策规范我国企业数字化治理市场。2018年9月颁布《关于发展数字经济稳定并扩大就业的指导意见》&#xff0c;支持建设一批数字经济创新创业孵化机构。积极推进供应链创新与应用&#xff0c;支持构建以企业为主导。…

《Python基础》之算数、比较、赋值、逻辑、位运算符

目录 简介 Python中常见的运算符 1、算数运算符 2、比较运算符 3、赋值运算符 4、逻辑运算符 5、位运算符 总结 简介 Python 提供了多种运算符&#xff0c;用于执行各种操作&#xff0c;包括算术运算、比较运算、逻辑运算、位运算、赋值运算等。以下是 Python 中常用的…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

【CSP CCF记录】201809-2第14次认证 买菜

题目 样例输入 4 1 3 5 6 9 13 14 15 2 4 5 7 10 11 13 14 样例输出 3 思路 易错点&#xff1a;仅考虑所给样例&#xff0c;会误以为H和W两人的装车时间是一一对应的&#xff0c;那么提交结果的运行错误就会让你瞬间清醒。 本题关键是认识到H和W的装车时间不一定一一对应&…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…

【PCB设计】AD16教程:分配位号

1、前提条件 确保已经基本画完原理图 2、点击【Tools-Annotate Schematics】 3、依次点击【Reset All】、【Update Changes Lise】、【Close】 最后位号就被自动分配好了

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本 2024/11/25 15:59 20241125编译友善之臂的NanoPi R3S开发板【RK3566】精简步骤 2024/11/25 19:37 viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ df -h viewproviewpro-T…

uniapp实际开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案&#xff1a; 在manifest.json文件&#xff0c;找到开源码视图配置&#xff0c;添加如下&#xff1a; "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

计算机网络:应用层知识点概述及习题

网课资源&#xff1a; 湖科大教书匠 1、概述 习题1 1 在计算机网络体系结构中&#xff0c;应用层的主要功能是 A. 实现进程之间基于网络的通信 B. 通过进程之间的交互来实现特定网络应用 C. 实现分组在多个网络上传输 D. 透明传输比特流 2 以下不属于TCP/IP体系结构应用层范畴…