C++学习(二十六)(C语言部分)之 结构体3(联合,枚举)
结构体 struct 类型定义
点运算符 . 变量名.成员 成员是数组的时候不能用等于号赋值
箭头运算符 -> 指针->成员
作用 存放多个不同类型的有关联的数据
与结构体类似的类型
1、联合
作用 :存放不同类型的数据 (共同体) 同事只能存储一个数据
关键字 :union 和结构体类似
联合与结构体的区别:
结构体:
是每个成员有地址分配 即有单独的内存 所以对其中一个元素赋值的时候不会影响其他元素的值
结构体大小时所有成员之和 结构体>=所有成员之和(大于的原因 结构体的对齐)
联合:
是共用内存 通一时间只能存放一个值 所以只能保证最后一次的赋值是正确的,其他的不能保证
联合的大小是所有成员大小的最大值 联合的大小>=所有成员大小的最大值(对齐)
结构体就像是一个 “大炕” 可以睡很多人 互不影响
联合就像是一个 “小床” 只能睡一个人 相互有影响的
联合的优点
1.定义新的变量 需要分配内存(栈区)
(可以形象的比喻成上体育课老师给学生发球,如果老师给每个人都发一个球就好像是是给每个变量都分配一个内存空间,这很耗费时间;
之后下课后老师收球也要一个一个的收回来,有很多,会很耗费时间,就好像是对变量在内存中占用的空间的的释放,很耗费时间。
所以如果老师只发一个球,每个人拍一下传递给下一个人,这样老师发球收球都不会耗费太多时间,而学生都会玩到球。
因此联合就是类似于这种情况,节省了空间时间)
2.可以结合数据的特征 进行分离
int 4个字节 --->可以定义一个联合对每一个字节分开处理
(电脑存储方式 大端->服务器上 小端->一般电脑)
(栈区内存自动释放 堆区内存需要手动释放)
枚举 列举出所有可能的值
关键字 enum
1.赋值的时候 是列举出可能的值 不用担心其他值(无效值)
用的是名称 可以用于case 不用担心遗漏或者对应关系错误导致的问题
直观 容易理解 不容易出错
2.枚举值是常量 每个值都对应一个数字
可以手动赋值 对第一个赋值之后 后面的默认加一
枚举类型是整型常量
注意:枚举定义的时候 枚举值名字不要重复
枚举是场量 可以用大写区分变量
不要加单引号和双引号
switch
扫雷中 0 1 2 3 4
箱子中 箱子 人 墙 目的地
用switch判断数据实现
用case表示 用数字和元素一一对应 对应关系用注释说明清楚 如果匹配出错不太好检查
case 1: //表示墙
case 2: //人
case 3: //箱子
case 4: //目的地
测试代码笔记如下:
#include<stdio.h> struct MyStruct //结构体
{
int a;
float b;
double c;
}; union MyUnion //联合 优点一验证
{
int a;
float b;
double c;
}; union Myint //联合 优点二验证
{
int a;
char arr[]; }; enum map //枚举的示例1
{
wall,people,box,aim //墙 人 箱子 目的地
}; enum dir //方向键枚举
{
UP,DOWN,LIEFT,RIGHT
}; int main()
{
#if 0
//-------------------结构体-------------------- struct MyStruct oug;
oug.a = ;
oug.b = ;
oug.c = ;
printf("结构体输出结果:%d %f %lf\n 结构体大小:%d\n", oug.a, oug.b, oug.c,sizeof(oug));
#endif //--------------------联合----------------------
#if 0
//联合的第一优点示例
union MyUnion danny;
danny.a = ;//在给.b赋值之前是一直有效的 以下同理
danny.b = ;
danny.c = 3.141592654;
printf("联合的输出结果:%d %f %.10lf\n 联合的大小:%d\n", danny.a,danny.b,danny.c,sizeof(danny)); //%.10lf 格式占位符 控制输出数据的精度 printf中%f %lf 没有区别的
//乱码的定义 输出不符合预期的都是乱码
#endif #if 0
//联合的第二优点示例 (共用内存!=共用值)
union Myint test;
test.a= 0x414243;//(65的十六进制是41 在ASCII码中65是A)
printf("打印结果%s\n", test.arr); //结果是CBA
printf("打印结果%d\n", test.a); //结果是414243 #endif //--------------------枚举----------------------
#if 1
//枚举的示例1
enum map point; //枚举变量
point = box; //赋值 赋已经列举所有值
switch (point) //在vs中使用table键 用switch方式可以自动列举出所有的值
{
case wall:
break;
case people:
break;
case box:
break;
case aim:
break;
default:
break;
}
printf("wall=%d\n", wall);
printf("people=%d\n", people);
printf("box=%d\n", box);
printf("aim=%d\n", aim); #endif getchar();
return ;
}
附:

2019-03-28 10:22:21
C++学习(二十六)(C语言部分)之 结构体3(联合,枚举)的更多相关文章
- Java开发学习(二十六)----SpringMVC返回响应结果
SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...
- 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写
一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...
- C语言基本语法——结构体、联合和枚举
一.结构体 1.什么是结构体 2.结构体语法格式 3.结构体所占内存空间 4.结构体成员赋值 二.联合 1.什么是联合 2.联合语法格式 三.枚举 1.什么是枚举 2.枚举语法格式 一.结构体 1.什 ...
- ElasticSearch7.3学习(二十六)----搜索(Search)参数总结、结果跳跃(bouncing results)问题解析
1.preference 首先引入一个bouncing results问题,两个document排序,field值相同:不同的shard上,可能排序不同:每次请求轮询打到不同的replica shar ...
- JavaWeb学习 (二十六)————监听器(Listener)学习(二)
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- 前端学习(二十六)移动端s(笔记)
===================================================弹性布局rem布局---------------------------------------- ...
- ballerina 学习二十六 项目docker 部署&& 运行(二)
ballerina 从发布,到现在官方文档的更新也是很给力的,同时也有好多改进,越来越好用了 可以参考官方文档 https://ballerina.io/learn/by-guide/restful- ...
- Salesforce LWC学习(二十六) 简单知识总结篇三
首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
随机推荐
- Win10系列:WinJS库控件
在介绍了如何使用标准的HTML控件以及WinJS库中提供的新控件之后,下面来着重介绍WinJS库中几种常用的控件. (1)ListView控件 在开发Windows应用商店应用时可以使用ListVie ...
- C++ 解析一
C++ 类和对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型.类用于指定对象的形式,它包含了数据表示法和用于处理数据 ...
- Uva 11520 - Fill the Square 贪心 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 对大学生学习Linux系统的七项实用建议
你现在的工作是你所渴望的理想工作吗?或者说这只是你整个职业生涯中的一段插曲?虽然我们每个人都不一定能够说出自己所想的是什么,但是我们心里其实跟明镜似的.相信许多人对于自己喜好的工作投入精力不会有问题, ...
- 【资料收集】Converting Between cv::Mat and QImage or QPixmap
参考: 方法一 Convert between cv::Mat and QImage 两种图片类转换 - Grandyang - 博客园 http://www.cnblogs.com/grandyan ...
- Java 集成开发环境的介绍及下载
集成开发环境(integrated development environment,JDE) 之前成功运行了Java小程序是经历了先在笔记本中编写源代码,然后通过命令行运行打开javac编译源文件, ...
- netty源码理解(二) serverstrap.bind()
eventloop是一个线程,里面有一个executor封装了一个线程工厂,在启动的时候启动一个线程,传入的实现了runnable的内部类,里面调用了eventloop的run方法.
- Linux平台搭建-----C语言
下面内容是新手上路,各位高手路过勿喷!因为我第一次发布,可能页面设置或者其他做的不好,还请见谅~该文章只是作为我学习C语言的笔记以及记录学习进程的. 零基础学习C语言---搭建Linux平台开发环境 ...
- L306 词汇题
Public acceptance of rabbit as an economical source of protein depends on how aggressively producers ...
- pl/sql developer中dbms_output.put_line函数的运用
pl/sql developer中dbms_output.put_line函数可以打印想显示在屏幕上的信息,运用时需要注意几点: 1 必须处于begin ... end: 2 需要先执行 set ...