c语言,自定义类型:联合体和枚举

news2025/2/25 3:24:46

联合体:

1.联合体类型的声明

当我们需要在程序中存储不同类型的数据,但又不想占用过多的内存空间时,联合体类型就可以派上用场。联合体类型的声明可以通过以下方式完成:

在C语言中,我们可以使用union关键字来声明联合体类型。下面是一个简单的示例:

union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

 

2.联合体的特点

  1. 存储不同类型的数据:联合体可以存储多种不同数据类型的值,但在任意时刻只能存储其中一种类型的数据。这使得联合体能够灵活地存储不同类型的数据,节省内存空间。

  2. 共享内存空间:联合体的成员变量共享同一块内存空间。因为联合体在任意时刻只能存储其中一种类型的数据,所以它的大小由其中占用空间最大的成员决定。这也意味着在同一时间只能使用其中的一个成员,因为改变一个成员的值可能会影响其他成员的值。

  3. 用于节省内存空间:联合体常用于需要节省内存空间的情况,例如在嵌入式系统或者对内存占用有严格要求的环境中。通过联合体,可以在不同类型的数据之间共享同一块内存空间,从而减少内存的占用。

  4. 适用于数据转换:联合体也常用于需要在不同类型数据之间进行转换的情况。通过存储不同类型的数据在同一块内存中,可以方便地进行数据类型的转换,提高程序的灵活性和效率。

看一段代码:

#include <stdio.h>

// 定义一个联合体
union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

int main()
 {
    union MyUnion u;

    u.intValue = 10;  // 存储int类型数据
    printf("Integer value: %d\n", u.intValue);

    u.floatValue = 3.14;  // 存储float类型数据,覆盖之前的int值
    printf("Float value: %f\n", u.floatValue);

    // 存储字符串,覆盖之前的float值
    strcpy(u.stringValue, "Hello, Union!");
    printf("String value: %s\n", u.stringValue);

    // 访问其他成员会出现问题,因为之前的赋值已经覆盖了内存
    printf("Integer value: %d\n", u.intValue);  // 未定义行为,可能输出意外结果

    return 0;
}

这段代码体现了联合体的特点:能够存储不同类型的数据,但在任意时刻只能存储其中一种类型的数据,且会共享同一块内存空间。


3.联合体大小的计算

当计算联合体的大小时,其大小取决于联合体中包含的最大成员的大小。来看一段代码:

#include <stdio.h>

union MyUnion 
{
    int intValue;
    float floatValue;
    char stringValue[20];
};

int main()
 {
    union MyUnion myUnion;
    printf("Size of int: %lu bytes\n", sizeof(int));
    printf("Size of float: %lu bytes\n", sizeof(float));
    printf("Size of char array: %lu bytes\n", sizeof(char[20]));
    printf("Size of union: %lu bytes\n", sizeof(union MyUnion));
    return 0;
}

结果展示: 

93571600e6504af8bb8ecda3dbb31b34.png

 当你运行这段代码时,你会看到联合体的大小是其成员中最大的那个。这是因为联合体在任意时刻只能存储其中一个成员的值,因此为了能够容纳联合体中的最大成员,联合体的大小就等于最大成员的大小。


枚举类型: 

1.枚举类型的声明

枚举类型是一种用户定义的数据类型,用于定义一个数值集合。在许多编程语言中,枚举类型可以通过关键字来声明。例如,在C语言中可以使用enum关键字来声明枚举类型。

enum Days 
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

2.枚举类型的优点和如何使用

当使用枚举类型时,可以通过有意义的枚举值来提高代码的可读性和可维护性。

例如:

#include <stdio.h>

// 定义枚举类型表示一周中的每一天
enum Days 
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

int main()
 {
    // 使用枚举值来表示一周中的每一天
    enum Days today = Wednesday;

    // 根据枚举值进行相关操作
    switch(today) 
{
        case Monday:
            printf("Today is Monday\n");
            break;
        case Tuesday:
            printf("Today is Tuesday\n");
            break;
        case Wednesday:
            printf("Today is Wednesday\n");
            break;
        case Thursday:
            printf("Today is Thursday\n");
            break;
        case Friday:
            printf("Today is Friday\n");
            break;
        case Saturday:
            printf("Today is Saturday\n");
            break;
        case Sunday:
            printf("Today is Sunday\n");
            break;
        default:
            printf("Invalid day\n");
    }

    return 0;
}

在上面的代码中,我们首先使用enum关键字定义了一个枚举类型Days,其中包含了一周中的每一天。然后在main函数中,我们声明了一个枚举类型的变量today,并将其赋值为Wednesday。接着使用switch语句根据枚举值进行判断,输出对应的信息。最后,我们输出了枚举值对应的整数值。

 9c390aaba26d4f8bb4f15b0a48dc4430.png

 

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

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

相关文章

动态代理IP和静态代理IP有什么区别,适用场景是什么?

互联网行业的从业者经常会用到一种工具&#xff0c;那就是代理IP工具。动态代理IP和静态代理IP是两种常见的代理IP技术&#xff0c;它们在网络通信中起到了重要的作用&#xff0c;比如大数据行业的从业者会经常需要用到动态代理IP&#xff0c;跨境行业的从业者会经常用到静态代…

NowCoder | KY11 二叉树遍历

NowCoder | KY11 二叉树遍历 OJ链接 简单来说就是构建这个二叉树定义结构体通过递归方式根据输入的字符串构建二叉树。对于输入字符串中的每个字符&#xff0c;如果是 ‘#’ 表示空节点&#xff0c;否则创建一个新节点&#xff0c;并递归地构建左右子树。 #include <limit…

leetcode 255.用队列实现栈

255.用队列实现栈 不出意外大概率这几天都会更新 leetcode&#xff0c;如果没有做新的题&#xff0c;大概就会把 leetcode 之前写过的题整理&#xff08;单链表的题目居多一点&#xff09;出来写成博客 今天讲的题蛮容易出错的&#xff08;注意传参啊&#xff0c;最好把队列的…

两道题浅析PHP反序列化逃逸

两道题浅析PHP反序列化逃逸 一、介绍 反序列化逃逸的出现是因为php反序列化函数在进行反序列化操作时&#xff0c;并不会审核字符串中的内容&#xff0c;所以我们可以操纵属性值&#xff0c;使得反序列化提前结束。 反序列化逃逸题一般都是存在一个filter函数&#xff0c;这个…

Pytest接口自动化测试框架搭建模板

auto_api_test 开发环境: Pycharm 开发语言&版本: python3.7.8 测试框架: Pytest、测试报告: Allure 项目源码Git地址 项目目录结构 api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用config – 配置文件目录data…

2023五岳杯量子计算挑战赛A题B题C题思路+模型+代码+论文

赛题思路&#xff1a;12月6日晚开赛后第一时间更新&#xff0c;获取见文末名片 “五岳杯”量子计算挑战赛&#xff0c;是国内专业的量子计算大赛&#xff0c;也是玻色量子首次联合移动云、南方科技大学共同发起的一场“企校联名”的国际竞赛&#xff0c;旨在深度融合“量子计算…

鸿蒙原生应用/元服务开发-新版本端云一体化模板体验反馈

一、前言 云端一体化模板是基于Serverless服务构建的一套模板&#xff0c;提供了应用生态常见场景需求的代码实现&#xff0c;开发者可将所需能力快速部署和集成到自己的应用中。 二、准备 体验最新的远端一体化模板&#xff0c;需要将云模板替换掉。为此&#xff0c;我们需要做…

解决使用Flipper无法连接到苹果模拟器,却能连接到安卓

而且这些都是显示正常 可是打开Virtual device一看ios一直在加载中 然后我打开日志看了下&#xff0c;然后各种找配置&#xff0c;项目里边配置改了又改&#xff0c;最后发现是缺少了个插件 //1、 检查 idb 和 idb_companion 是否已经安装 brew tap facebook/fb brew install …

一文彻底搞懂机器学习中的归一化与反归一化问题

1、什么是归一化和反归一化 话不多说&#xff0c;先上一段代码&#xff0c;自己体会&#xff1a; import numpy as np from sklearn.preprocessing import MinMaxScaler #导入库data np.random.randint(0,5,size5) #随机生成长度为5的数据 data np.array(data).reshape((len…

Java多线程详解(上)——2023/11/23

Process&#xff08;进程&#xff09;与Thread&#xff08;线程&#xff09; 说起进程&#xff0c;就不得不说下程序。程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。而进程则是执行程序的一次执行过程&#xff0c;它是一个动…

完善根文件系统

一. 简介 本文完善之前创建的根文件系统。 上一篇文章通过 设置 bootargs参数&#xff0c;使开发板通过 nfs服务从 ubuntu系统加载根文件系统。文章地址如下&#xff1a; 根文件系统初步测试-CSDN博客 二. 完善根文件系统 上一篇文章通过 设置 bootargs参数&#xff0c;使…

3D Gaussian Splatting的使用

3D Gaussian Splatting的使用 1 下载与安装2 准备场景样本2.1 准备场景照片2.1.1 采集图片2.1.2 生成相机位姿 3 训练4 展示 1 下载与安装 今年SIGGRAPH最佳论文&#xff0c;学习了一下&#xff0c;果然厉害&#xff0c;具体论文原理就不说了&#xff0c;一搜都有&#xff0c;…

Kubernetes(K8s)安全认证-10

安全认证 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#xff0c;客户端通常有两类&#xff1a; User Acco…

【算法刷题】Day13

文章目录 1658. 将 x 减到 0 的最小操作数题干&#xff1a;算法原理&#xff1a;滑动窗口代码&#xff1a; 91. 解码方法题干&#xff1a;算法原理&#xff1a;1、状态表示2、状态转移方程3、初始化4、填表顺序5、返回值6、代码&#xff1a;7、优化 1658. 将 x 减到 0 的最小操…

华为云RDS通用型(x86) vs 鲲鹏(ARM)架构的性能对比

概述 之前&#xff0c;我们对比了阿里云RDS的经济版&#xff08;ARM&#xff09;与x86版的性价比&#xff0c;这次我们来看看华为云的RDS MySQL的“通用型”(x86)与“鲲鹏通用增强型”(ARM)版本的情况如何。 这里依旧选择了用户较为常用的4c16g的规格进行测试&#xff0c;测试…

mp3的播放

1.这段vue代码会播放声音&#xff0c;但是会有audio标签 <template><div><audio id"myAudio" controls><source src"./test.mp3" type"audio/mp3" />Your browser does not support the audio tag.</audio></…

webGL开发科学模拟

开发科学模拟应用涉及到使用 WebGL 进行高性能的图形渲染&#xff0c;同时结合科学计算和模拟算法。以下是一般的技术方案&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.WebGL 框架&#xff1a; …

C/C++,数字序列——查找第n个鲍姆甜序列(Baum Sweet Sequence)的计算方法与源程序

1 文本格式 // CPP code to find the nth term of the Baum Sweet Sequence #include <bits/stdc.h> using namespace std; int nthBaumSweetSeq(int n) { // bitset stores bitwise representation bitset<32> bs(n); // len stores the number of bits…

【云原生 | Docker】Docker核心概念 应用上手最佳流程

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

基因组变异注释 — ANNOVAR(一)

基因组变异注释 — ANNOVAR&#xff08;一&#xff09; 1 简介 ANNOVAR 是一款高效的基因组注释工具&#xff0c;专门用于分析和注释来自多种生物基因组&#xff08;包括人类的 hg18、hg19、hg38&#xff0c;以及小鼠、蠕虫、果蝇、酵母等&#xff09;的遗传变异。这个工具实际…