如何系统学习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 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
随机推荐
- 【LeetCode】300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))
算法新手,刷力扣遇到这题,搞了半天终于搞懂了,来这记录一下,欢迎大家交流指点. 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删 ...
- 位运算符的用法 ----非(!),与(&),或(|),异或(^)
位运算符的用法 ----非(!),与(&),或(|),异或(^) 三种运算符均针对二进制 非!:是一元运算符.对一个二进制的整数按位取反,输入0则输出1,输入1则输出0. 例: 0100 -( ...
- Linux7安装redis6
首先下载软件包并解压 cd /opt wget https://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5. ...
- 技术番外篇丨Github Action CI/CD
起源 看到.Net群里再聊CI/CD,我就这里分享一下我目前自己一些小东西的做法,我目前在Github有一个自己私有的组织,里面存放了我的部分商业化项目,早期我采用Jenkins用Webhooks进行 ...
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
- Conda 命令
Conda 命令 1 检验当前conda的版本 conda -V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建pyt ...
- 洛谷4322 SHOI2014 三叉神经树(LCT+思维)
好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊..qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的. 那么\(val[x]>&g ...
- SpringBoot整个Druid
Druid简介 Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池. Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0.DBCP 等 ...
- Java(29)集合四Collections
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228439.html 博客主页:https://www.cnblogs.com/testero ...
- k8s replicaset controller分析(1)-初始化与启动分析
replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...