22-联合体与枚举

news2024/9/21 22:22:58

22-联合体与枚举

文章目录

  • 22-联合体与枚举
    • 一、 联合体
      • 1.1 定义和特点
      • 1.2 语法
      • 1.3 示例
      • 1.4 联合体的使用
      • 1.5 联合体的使用:检查系统的字节序
    • 二、 枚举
      • 2.1 定义和特点
      • 2.2 语法
      • 2.3 枚举常量的值可以手动修改

一、 联合体

1.1 定义和特点

联合体(Union)与结构体(Struct)在语法上非常相似,但它们在内存布局和使用方式上有显著的不同:

  • 结构体:每个成员都有独立的内存空间,各成员可以同时存在,互不影响。
  • 联合体:所有成员共享同一个内存空间,任意时刻只有一个成员是有效的。

联合体的每个成员公用同一个内存空间,因此也被称为共同体。联合体的尺寸取决于其最宽的成员。

1.2 语法

union 联合体标签 {
    成员1;
    成员2;
    成员3;
    // 其他成员
};

1.3 示例

#include <stdio.h>

union node {
    int i;
    char c;
    short s;
    double d;
};

int main(int argc, char const *argv[]) {
    union node data;

    printf("size: %ld\n", sizeof(data));
    printf("i: %p\n", &data.i);
    printf("c: %p\n", &data.c);
    printf("s: %p\n", &data.s);
    printf("d: %p\n", &data.d);

    return 0;
}

空间:
在这里插入图片描述

输出:
在这里插入图片描述

注意事项

  1. 联合体的尺寸取决于其最宽的成员。
  2. 联合体中所有成员的内存地址(首地址)是相同的。
  3. 任意时刻,只有一个成员是有效的给某个成员赋值会使其他成员失效

1.4 联合体的使用

联合体一般较少使用,更多时候是作为结构体的一部分,用来描述互斥的数据。

#include <stdio.h>
#include <string.h>

typedef struct demo {
    char Name[32];
    union {
        char Type;   // S 学生, T 老师, F 打饭阿姨, Q 清洁工
        float num;   // 成绩
        int i;       // 手抖值
        char c;      // 清洁能力
    } stat;
} Node;

int main(int argc, char const *argv[]) {
    Node data[3];

    // 清洁工
    strncpy(data[0].Name, "Even", 32);
    data[0].stat.Type = 'Q';
    data[0].stat.c = 'A';

    // 学生
    strncpy(data[1].Name, "Jacy", 32);
    data[1].stat.Type = 'S';
    data[1].stat.num = 13.86;

    // 打饭阿姨
    strncpy(data[2].Name, "CuiHua", 32);
    data[2].stat.Type = 'F';
    data[2].stat.i = 13;

    for (size_t i = 0; i < 3; i++) {
        switch (data[i].stat.Type) {
            case 'Q':
                printf("当前输出为清洁工:\n名字:%s\t人猿类型:%c\t清洁能力:%c\n",
                       data[i].Name, data[i].stat.Type, data[i].stat.c);
                break;
            case 'S':
                printf("当前输出为学生:\n名字:%s\t人猿类型:%c\t学习能力:%f\n",
                       data[i].Name, data[i].stat.Type, data[i].stat.num);
                break;
            case 'F':
                printf("当前输出为打饭阿姨:\n名字:%s\t人猿类型:%c\t抖肉能力:%d\n",
                       data[i].Name, data[i].stat.Type, data[i].stat.i);
                break;
        }
    }

    return 0;
}

1.5 联合体的使用:检查系统的字节序

可以使用联合体来检查系统是大端(Big-endian)还是小端(Little-endian):
小端序:
在这里插入图片描述

#include <stdio.h>

int check_endianness() {
    union {
        int i;
        char c[sizeof(int)];
    } u;
    u.i = 1;
    return u.c[0] == 1;
}

int main() {
    if (check_endianness()) {
        printf("Little-endian\n");
    } else {
        printf("Big-endian\n");
    }
    return 0;
}

或者是:在这里插入图片描述

二、 枚举

2.1 定义和特点

枚举(Enumeration)是一种特殊的整型变量,枚举常量列表定义了一组有意义的整型常量。枚举本质上一种范围受到限制的整型,比我们可以使用 0 - 3 表示4种状态(比如某个硬件的状态:打开、运行、暂停、关闭)

2.2 语法

enum 枚举标签 { 常量1, 常量2, 常量3, 常量4 };

示例

#include <stdio.h>

enum MIC { open, run, stop, close };

int main(int argc, char const *argv[]) {
    enum MIC stat = run;

    switch (stat) {
        case open:
            printf("麦克风状态为打开:%d\n", open);
            break;
        case run:
            printf("麦克风状态为运行中:%d\n", run);
            break;
        case stop:
            printf("麦克风状态为暂停:%d\n", stop);
            break;
        case close:
            printf("麦克风状态为关闭:%d\n", close);
            break;
    }
    return 0;
}

2.3 枚举常量的值可以手动修改

enum MIC { open, run = 5, stop, close };

注意

  • 枚举常量默认从0开始,后续常量依次递增
  • 枚举的本质是整型,可以进行所有整型操作。
  • 枚举提高了代码的可读性和可维护性。

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

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

相关文章

扩展PyTorch视觉模型

扩展PyTorch视觉模型 目录 扩展PyTorch视觉模型 一、概述 二、扩展基本视觉模型的原因 1. 性能提升 2. 功能扩展 3. 资源管理 三、扩展PyTorch视觉模型的方法 1.修改现有架构 2.应用模型集成技术 3.量化和压缩模型 四、高级技巧与实践 1.自定义训练循环 2.深度模型…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2)

系列文章目录 本文章分为2个部分&#xff1a; Part 1主要涉及Gitlab、Gitlab-Runner、Git-Ci、Sonar-qube-CI阶段 Part 2主要涉及ArgoCD阶段 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 1)-CSDN博客 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2) 文章目录 目…

【测试能力提升----fastapi框架项目】需求分析

1. FastAPI框架架构 2. 场景分析 2.1 系统分类 单一用户权限系统&#xff08;实用于CMS模型&#xff09;多用户多权限系统&#xff08;实用于多租商户类型&#xff09; 2.2 功能模块 用户登录模块用户管理模块角色权限管理模块基本设置模块日志模块 2.3 需求分析 用户登录…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

24年广东“双百社工”招聘报名流程详细步骤

还在蹲公告的宝子们注意啦&#xff01;&#x1f525;24年广东双百社工公告陆续出啦&#xff01;⚠️中山双百社工招聘57人&#xff0c;佛山双百社工招聘135人&#xff0c;其他地区也快了&#xff01;⏰留给我们备考的时间只有一个月左右&#xff0c;想一次上岸的宝子抓紧备考&a…

《专题》numpy科学计算基础库——精细化讲解 <1>

一、什么是numpy库 Numpy(Numerical Python) 是科学计算基础库&#xff0c;提供大量科学计算 相关功能&#xff0c;比如数据统计&#xff0c;随机数生成等。其提供最核心类型为多维数组类型&#xff08;ndarray&#xff09;&#xff0c;支持大量的维度数组与矩阵运算&#xff0…

Java面试题(每日更新)

每日五道&#xff01;学会就去面试&#xff01; 本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单&#xff0c;下面一起进入主题吧。 目录 1.概述 2.Java 基础 2.1 JDK 和 JRE 有什么区别&#xff1f; 2.2 和 equals 的区别是什么&#xff1f; 2.3 两个对象的…

Linux ls命令详解

学习 Linux &#xff0c;本质上是学习在命令行下熟悉使用 Linux 的各类命令&#xff1b; 1. Linux 命令通用格式 命令格式&#xff1a;命令 【-选项】【参数】(个别命令不遵循该格式) 短线&#xff08;-&#xff09;是区分选项和参数的标志&#xff0c;选项用来调整命令的功能…

redis的学习(一):下载安装启动连接

简介 redis的下载&#xff0c;安装&#xff0c;启动&#xff0c;连接使用 nosql nosql&#xff0c;即非关系型数据库&#xff0c;和传统的关系型数据库的对比&#xff1a; sqlnosql数据结构结构化非结构化数据关联关联的非关联的查询方式sql查询非sql查询事务特性acidbase存…

前端系列-6 使用Vue3搭建前端工程与setup语法糖介绍

背景 本文介绍如何使用vue3脚手快速搭建一个前端项目&#xff0c;并对生成的项目结构进行简单介绍&#xff0c;然后介绍setup语法糖。前端入门的同学可基于本文内容快速搭建属于自己的项目。 vue官网资料显示, vue3开发的项目相对vue2, 具有打包后体积变小&#xff0c;极速启动…

【网络】socket和udp协议

socket 一、六个背景知识1、Q1&#xff1a;在进行网络通信时&#xff0c;是不是两台机器在进行通信&#xff1f;2、端口号3、端口号vs进程PID4、目的端口怎么跟客户端绑定的呢&#xff1f;也就是怎么通过目的端口去找到对应的进程的呢&#xff1f;5、我们的客户端&#xff0c;怎…

textblob文本处理、词性分析与情感分析

1 前言 textBlob 是一個简单易用的 NLP库&#xff0c;基于 NLTK 和 pattern库&#xff0c; 提供了文本处理和情感分析等功能。 安装 textblob0.18.0 nltk3.8.1测试环境&#xff1a;Python3.10.9 使用前&#xff0c;先运行下面代码先下载些文件 import nltk nltk.download…

机器学习 | 阿里云安全恶意程序检测

目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…

「YD-221WA无线多合一变送器」让高效监测触手可及!

前言 近年来&#xff0c;伴随着“中国制造2025”、“互联网”在我国的全面推进&#xff0c;智能无线仪表设备在工业控制领域大规模应用。“设备上云”成为众多企业实现数字化转型升级的重要策略&#xff0c;为提升仪表设备管理软件的网络化、智能化、易维护性等方面提供了强有…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

1.3、校验码

校验码 简介奇偶校验编码方法分类注意练习题 CRC循环冗余校验模2除法异或运算模2除法计算过程 循环冗余校验CRC过程练习题选择题 海明校验步骤练习题 简介 计算机在接收相应信息的时候&#xff0c;能够识别的都是一些电信号或者转化后的0 1二进制。那包括我们在网络上传递信息…

昇思25天学习打卡营第16天|LLM-MindNLP ChatGLM-6B StreamChat

打卡 目录 打卡 任务说明 环境配置 部署方式 ChatGLM-6B 体验截图示例 ChatGLM-6B 模型结构解析如下 ChatGLM2-6B 模型结构解析如下 任务说明 加载智谱清言的chatglm模型权重文件&#xff08;目前有4个版本&#xff09;&#xff0c;本次主要尝试了chatglm-6b。 chatgl…

人工智能(AI)在办公场所的广泛应用

人工智能&#xff08;AI&#xff09;在办公场所的广泛应用正逐步改变着我们的工作方式和效率。随着技术的进步&#xff0c;越来越多的公司和组织开始采用各种AI技术来优化工作流程、提升生产力&#xff0c;并提供更好的用户体验。以下是人工智能在办公方面的一些主要作用和影响…

C++中,虚函数的作用详解

我个人认为虚函数的作用有两个&#xff1a; 增加安全性&#xff1b;提醒子类去做该做的事情。 提高效率&#xff1b;不是指程序执行效率&#xff0c;而是编码效率。 首先我这里要纠正一下&#xff1a; 一个函数被定义为虚函数&#xff0c;不代表这个函数未被实现&#xff1…