联合和枚举

1、联合

联合(union)是一种数据类型,它能在用一个内存空间中存储不同的数据类型(但不是同时存储)。其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。 使用联合类型的话,其中的联合都大小相等,每个联合可以存储各种数据类型。

联合体的特点是所有成员共用一块内存空间。所以联合体也叫:共用体。 创建联合和创建结构的方式相同,需要一个联合模板和联合变量。

下面是一个带标记的联合模板:

union hold
{int dight;double bigfl;char letter;
};

根据以上形式的声明的结构可以存储一个int类型、一个double类型和char类型的值。。然后,声明的联合只能存储一个int类型的值或一个double类型的值或char类型的值。

下面定义了3个与hold类型相关的变量:

union hold fit;		//hold类型的联合变量
union hold save[10];//内含10个联合变量的数据
union hold* pu;		//指向hold类型联合变量的指针

第一个声明创建了一个到哪都的联合变量fit。  编译器分配足够的空间以便它能存储联合声明中占用最大字节的类型。 在本例中,占用空间最大的double 类型的数据, 在我们的系统中,double类型占64位,即8字节。  第二个声明创建了一个数组save,内含10个元素,每个元素都是8字节。第3个声明创建了一个指针,该指针变量存储hold类型联合变量的地址。

#include <stdio.h>
union hold
{int dight;double bigfl;char letter;
};
int main()
{union hold u = { 0 };printf("%p\n", &u);printf("%p\n", &(u.bigfl));printf("%p\n", &(u.dight));printf("%p\n", &(u.letter));return 0;
}

运行结果:

我们发现。这4个地址都相同。所以,也就是说明联合体共用一块内存空间。

联合体的大小

我们来看看下面的代码:

#include <stdio.h>
union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{//下⾯输出的结果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

结果: 。这是为什么呢?

其实联合体和结构体一样,都有最大对齐数。但又和结构体有所不同。

在Un1中,char类型占1个字节,有5个char共占用5个字节,int类型,占用4个字节。默认对齐数是8,又因为联合体共用一块内存空间,所以总共占用8字节。在Un2中,short类型的c数组共占用14个字节,int类型占4个字节。按最大对齐数的整数倍占用空间,所以是16个字节。

联合体共用一块内存空间,所以只能同时使用一个。比如说,我使用变量dight,就不能使用bigfl和letter变量,因为空间被dight使用了。

2、枚举

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。

枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。

定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。

声明枚举类型

enum spectrum
{red,orange,yellow,green,blue,violet
};
enum spectrum color;

第1个声明创建了作为标记名,允许把enum spectrum作为一个类型名使用。第2个声明使color作为该类型的变量。第1个声明中花括号内的标识符枚举了spectrum变量可能有的值。因此,color可能的值是red、orange、yellow等。这些符号常量被称为枚举符。

再看这个枚举:

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};

第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

枚举变量的定义

1、先定义枚举类型,再定义枚举变量

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2、定义枚举类型的同时定义枚举变量

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3、省略枚举名称,直接定义枚举变量

enum
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

实例:

#include <stdio.h>enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};int main()
{enum DAY day;day = WED;printf("%d",day);return 0;
}

结果:3

在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。

不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。

以下实例使用 for 来遍历枚举的元素:

#include <stdio.h>enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{// 遍历枚举元素for (day = MON; day <= SUN; day++) {printf("枚举元素:%d \n", day);}
}

以上实例输出结果为:

枚举元素:1 
枚举元素:2 
枚举元素:3 
枚举元素:4 
枚举元素:5 
枚举元素:6 
枚举元素:7

 以下枚举类型不连续,这种枚举无法遍历

enum
{ENUM_0,ENUM_10 = 10,ENUM_11
};

枚举在 switch 中的使用

#include <stdio.h>
#include <stdlib.h>
int main()
{enum color { red=1, green, blue };enum  color favorite_color;/* 用户输入数字来选择颜色 */printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");scanf("%u", &favorite_color);/* 输出结果 */switch (favorite_color){case red:printf("你喜欢的颜色是红色");break;case green:printf("你喜欢的颜色是绿色");break;case blue:printf("你喜欢的颜色是蓝色");break;default:printf("你没有选择你喜欢的颜色");}return 0;
}

以上实例输出结果为:

请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色

将整数转换为枚举

#include <stdio.h>
#include <stdlib.h>int main()
{enum day{saturday,sunday,monday,tuesday,wednesday,thursday,friday} workday;int a = 1;enum day weekend;weekend = ( enum day ) a;  //类型转换//weekend = a; //错误printf("weekend:%d",weekend);return 0;
}

以上实例输出结果为:

weekend:1

 

了解一下

共享名称空间

C语言使用名称空间标识程序中的各部分,即通过名称来识别。作用域是名称空间概念的一部分:两个不同作用域的同名变量不冲突;两个相同作用域的同名变量冲突。名称空间是分类别的。在特定作用域中的结构标记、联合标记和枚举标记都共享相同的名称空间,该名称空间与普通变量使用的空间不同。这意味着在相同作用域中变量和标记的名称可以相同,不会引起冲突,但是不能在相同作用域中声明两个同名标签或同名变量。例如,在C中,下面的代码不会产生冲突:

struct rect { double x; double y; };
int rect; //在C中不会产生冲突

尽管如此,以两种不同的方式使用相同的标识会造成混乱。另外,C++中不允许这样做,因为它把标记名和变量名放在相同的名称空间中。

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

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

相关文章

国际收支平衡表的分析要点有哪些

国际收支统计是国民经济综合平衡必不可少的一个环节&#xff0c;国际收支的顺差或逆差可以弥补国内投资和消费与国内生产总值间的缺口&#xff0c;国际收支状况可影响国内信贷平衡&#xff0c;对金融调控至关重要。良好的国际收支统计信息是制定正确的对外经济政策的基础。 一…

解读币安Megadrop:如何参加第一期BounceBit活动?

币安推出新的代币发行平台 Megadrop&#xff0c;第一期为 BounceBit。 跟 launchpool 相比&#xff0c; 主要不同是 1&#xff09;锁仓 bnb 有收益的倍数加成 2&#xff09;做任务有收益加成。 我认为核心目的有两个&#xff1a; 1&#xff09;更多收益给 BNB 长期持有者&am…

NovaMSS音乐源分离v1.3.3社区版

软件介绍 NovaMSS 基于最新 AI 模型优化的音乐源分离工具。它能够轻松地批量提取伴奏、人声、贝斯、鼓点等音轨&#xff0c;并且支持 GPU 加速&#xff0c;以提高处理速度和效率。社区版完全免费&#xff0c;简单易用&#xff0c;上传文件&#xff0c;点击处理&#xff0c;查看…

K8s七层代理Ingress Controller详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、Ingress Controller简介…

vlan的学习笔记2(vlan间通信)

1.使用路由器的物理接口 原理&#xff1a;在二层交换机上配置VLAN&#xff0c;每个VLAN单独使用一个交换机接口与路由器互联。路由器使用两个物理接口&#xff0c;分别作为VLAN 10及VLAN 20内PC的默认网关&#xff0c;使用路由器的物理接口实现VLAN之间的通信。 实验1&#x…

每一个优秀的Java程序员都应该掌握的90条编程法则

经典Jolt 获奖作品Effective Java的第3版&#xff0c;从Java 5 到Java 9的种种特性&#xff0c;Java 开发人员不可缺少的一本参考书&#xff1a;Effective Java中文版(原书第3版)&#xff0c;2024全新译本&#xff0c;豆瓣原版评分9.6&#xff0c;中文版9.8。 作者约书亚.布洛克…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

跟着Datawhale重学数据结构与算法(3)---排序算法

开源链接&#xff1a;【 教程地址 】【电子网站】 【写博客的目的是记录自己学习过程&#xff0c;方便自己复盘&#xff0c;专业课复习】 数组排序&#xff1a; #mermaid-svg-F3iLcKsVv8gcmqqC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16p…

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错&#xff0c;是由于系统叫老yum源存在问题 处理方法 更换下述yum源&#xff0c;可以将其他repo源文件备份移动到其他目录&#xff0c;添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

A Neural Span-Based Continual Named Entity Recognition Model

《A Neural Span-Based Continual Named Entity Recognition Model》------------AAAI’23 论文链接&#xff1a;https://arxiv.org/abs/2302.12200 代码&#xff1a;https://github.com/Qznan/SpanKL 当前问题&#xff1a; 1.现有的NER模型在适应新的实体类型时往往表现不佳…

网站被SmartScreen标记为不安全怎么办?

在互联网时代&#xff0c;网站的安全性和可信度是用户选择是否继续访问的重要因素之一&#xff0c;然而&#xff0c;网站运营者偶尔会发现使用Edge浏览器访问网站时&#xff0c;会出现Microsoft Defender SmartScreen&#xff08;以下简称SmartScreen&#xff09;提示网站不安全…

element plus:tree强制更新

使用element plus的tree组件&#xff0c;做大屏设计器的图层列表&#xff0c;在左边的tree里和中间的编辑器里都可以右键上下移动图层&#xff0c;但是我遇到一个问题&#xff0c;往编辑器里增加组件&#xff0c;这种较大的变动&#xff0c;tree的渲染可以立马同步更新&#xf…