如何系统学习C 语言(中)之 联合体、枚举篇
在C语言中有一个和结构体非常像的数据类型,它的名字叫做联合体,也被称为共用体或公用体。
1,联合体
1,联合体的定义
定义联合体需要使用"union" 关键字,格式如下:
union 联合体名{
数据类型 成员1;
数据类型 成员2;
...
};
2,联合体的大小
联合体和结构体最大的区别就是在内存存储上。结构体的每个成员都有自己独立的内存空间,结构体大小为所有成员的大小之和(不考虑内存对齐情况)。而联合体的所有成员都使用同一段内存空间,联合体的大小即为联合体中最大的那个成员大小。例如定义下面一个联合体:
union A {
char a;
int b;
double c;
};
最大的成员是double 类型的 c ,大小为8个字节。因此联合体的大小就是c 的大小。同样,我们也可以用 sizeof运算符来获取联合体A 的大小。
3,联合体变量的初始化
因为联合体不能同时存储多个成员的值。所以,在初始化的时候,只应对一个成员进行初始化,即初始化列表中只放一个初始值。在默认情况下,会将这个初始值给联合体变量的第一个成员。例如:
union A a1 = {'A'};
如果想对其他位置的成员进行初始化,则可以通过指定初始化方式。例如:
union A a1 = {.b=35}; //通过指定初始化将联合体变量a1的成员b初始化值为35
4,联合体变量的访问和赋值
对联合体变量中的成员赋值,也是使用成员访问运算符,即点运算符。如下:
union A a1 = {'A'};
printf("Member a : %c\n",a1.a); //输出结果为 Member a :A
联合体应用案例
在计算机网络中,两台计算机要想通信,就需要知道彼此的ip 地址。那我们思考一下如何存储类似于“192.168.0.1”的点分格式的ip 地址呢?
下面我们就编写程序,由用户输入一个ip地址,程序可以将其转换为4 字节整型类型的IP 地址值,并打印输出:代码如下:
#include<stdio.h>
union IP{
unsigned char str[4];
unsigned int digit;
};
int main(){
union IP ip; //定义联合体变量ip
printf("Please enter IP address in string format:\n");
//接收用户输入的IP地址,并将其存储至字符数组
scanf("%d.%d.%d.%d",&ip.str[0],&ip.str[1],&ip.str[2],&ip.str[3]);
//打印输出数字格式的IP地址值
printf("IP address in digital format is: %u\n",ip.digit);
return 0;
}
2,枚举
C语言中,还允许定义枚举类型。使用枚举类型,可以提高程序代码的健壮性和可读性,并且枚举成员属于常量。
1,枚举的定义
枚举的定义格式为:
enum 枚举名{枚举成员1,枚举成员2,...};
例如定义一个和方向相关的枚举类型Dir:
enum Dir{up,down,left,right};
前面说了,枚举成员是常量,既然是常量,就应该有对应的值,那上面的四个方位的值又是多少呢?那下面就让输出语句告诉我们吧:
printf("up = %d\n",up);
printf("down = %d\n",down);
printf("left = %d\n",left);
printf("right = %d\n",right);
//运行结果如下:
up = 0;
down =1;
left = 2;
right =3;
是否发现了什么呢?是的,默认情况下,枚举成员是一个整型值,其第一个枚举成员的值为0,而后续枚举成员的值为其前一个枚举成员的值加1。
那是否能够自己设置枚举成员的值呢?当然是可以的。例如:
enum Dir{up,down = 10,left,right};
//同样通过printf 语句输出结果就是你想的那样:
up = 0;
down = 10;
left =11;
right =12;
2,枚举变量的定义
枚举变量的定义与结构体和联合体的变量定义方式类似,如通过如下几种方式:
enum Dir dir1; //先定义枚举,再定义枚举变量
enum Dir{up=2,down,left,right}dir2; //在定义枚举的同时定义枚举变量
enum {up=2,down,left,right}dir3; //定义无名枚举类型的枚举变量
最后,C 语言中,可以将枚举成员视为整型常量,而将枚举变量视为整型变量。因此,可以将一个整型值初始化或者赋值给枚举变量。
如何系统学习C 语言(中)之 联合体、枚举篇的更多相关文章
- 如何系统学习C 语言(中)之 指针篇
谈到指针,我们可能会想到钟表上的指针,但这里的指针不是现实生活中看得见摸得着的钟表上的指针,c 语言中的指针只存在于逻辑思维中,物理上并不存在. 同时,指针也是C 语言中最精华的部分,通过灵活地运用指 ...
- 如何系统学习C 语言(中)之 结构体篇
1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...
- 从入门到掌握 - 系统学习shell语言
简介 什么是 shell Shell是一种程序或命令行解释程序,用于解释用户直接输入的用户命令或从文件中读取的用户命令,然后将 它们传递给操作系统以进行操作或处理.要注意,这个过程是解释而不编译脚本, ...
- 系统学习 javaweb2----HTML语言2
感想:学习javaweb之路,任重而道远. 学习笔记: 5.表格标签 5.1<table></table> 表格标签,用于效果中定义一个表格 5.2<tr>< ...
- 如何系统学习C 语言(上)之 基础篇
大话C 语言(一) 初识C 语言 老实说,上大学之前我根本不知道什么是C 语言,所以当初学校开设这门课时,我是充满了好奇,所以当初我翻阅了大量的C 语言入门书籍,千篇一律,都是从一些概念.术语和理论讲 ...
- 如何系统学习C 语言(下)之 文件篇
我们所编写的程序源代码以及编译生成的可执行文件都属于文件.所以文件的实质就是存储在外部存储介质上的一段连续的二进制数据. c 语言程序对文件的处理采用文件流的形式,程序运行在内存中,而文件是存储在外部 ...
- 浅谈C语言中的联合体
联合体union 当多个数据须要共享内存或者多个数据每次仅仅取其一时.能够利用联合体(union).在C Programming Language 一书中对于联合体是这么描写叙述的: 1)联合体是一个 ...
- C语言中的联合体union所占内存方式
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
随机推荐
- MyBatis-Plus代码生成器的使用
1.MyBatis-Plus简介 在代码开发中,肯定会遇到代码中对应数据库表去编写实体类的工作,若数据库表数量多的情况下,编写Entity,属实是一件消耗时间,且并没有什么技术含量的事情,如何解决 ...
- VUE自学日志01-MVC和MVVM
一.需要了解的基础概念 Model(M)是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开.这里的难点主要在于需要和前端约定统一的接口规则. View(V)是视图层,也就是 ...
- CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...
- C 字符串相关的库函数
字符串操作函数 size_t strlen( char *string ); 返回字符串长度 char* strcpy( char *dst, char const *src ); 将src复制到ds ...
- 蝉知CMS 7.X XSS漏洞复现
个人博客地址:xzajyjs.cn 作为一个开源的企业门户系统(EPS), 企业可以非常方便地搭建一个专业的企业营销网站,进行宣传,开展业务,服务客户.蝉知系统内置了文章.产品.论坛.评论.会员.博客 ...
- 如何接入 K8s 持久化存储?K8s CSI 实现机制浅析
作者 王成,腾讯云研发工程师,Kubernetes contributor,从事数据库产品容器化.资源管控等工作,关注 Kubernetes.Go.云原生领域. 概述 进入 K8s 的世界,会发现有很 ...
- 5.27日Scrum Metting
日期:2021年5月27日 会议主要内容概述:确定账单数据格式,确定需要添加新的图表,确定模板分享功能任务量. 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 ...
- Alpha阶段初始任务分配
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-Alpha阶段说明书 一.Alpha阶段总体规划 进行服务器相关部署 进行开发相关技术学习 ...
- RSA加密——前端JSEncrypt
RSA加密--前端JSEncrypt 介绍 JSEncrypt是一个RSA加密库,在没有SSL加密传输通道支持https协议的情况下,该库可以在http传输重要信息如时,保证数据的安全性.我们小组 ...
- spring security整合QQ登录
最近在了解第三方登录的内容,尝试对接了一下QQ登录,此次记录一下如何实现QQ登录的过程,在这个例子中是和spring secuirty整合的,不整合spring secuirty也是一样的. 需求: ...