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 < ...
随机推荐
- 技术宅学习Linux系统还是很有前途的
老实说,我之所以入了Linux的坑,纯粹只是为了追我现在的男朋友,也就是技术宅.如果不是为了追我男朋友的话,我估计我这辈子都不会去接触linux.好吧,今天写一写过往事情,也是为了怀念当初追男友的一些 ...
- Python Django 之 Template 模板的使用
一.模板样式 注意: 1.url urlpatterns = { path('admin/', admin.site.urls), path('order/', views.order), path( ...
- 读书笔记 C# yield return与yield break执行顺序的浅析
yield return可一次返回一个元素,并保留当前在代码中的位置,下次调用当前迭代器函数时,将从该位置从新执行.也就是说执行了yield return的时候,迭代器函数就返回了一个元素给forea ...
- (C/C++学习笔记) 七. 类型转换
七. 类型转换 ● 隐式类型转换 隐式类型转换 implicit type conversions #include<iostream> using namespace std; void ...
- leetcode python 002
##002 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8# 链表节点都是一位数字,以上可以视为2 ...
- js正则学习
一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...
- CAN总线(1)--初探(更新中)
前言: CAN总线可以控制可以使用Xilinx中IP核来直接实现,也可以使用专用的CAN芯片(例如:SJA1000)通过单片机和FPGA驱动控制来实现: 目前是使用控制器SJA1000来进行实现: C ...
- StringUtils方法介绍
引用StringUtils方法全集介绍 C标准中空白字符有:空格(‘ ’).换页(‘\f’).换行(‘\n’).回车(‘\r’).水平制表符(‘\t’).垂直制表符(‘\v’)六个.
- oracle语句录
从表中选出一个某个单位最近的记录 select * from RSDL_SHXX where sbsj in (select max (sbsj) from RSDL_SHXX where DW_ID ...
- 20165326 java第二周学习笔记
学习笔记 一.理论学习 基本数据类型与数组 标识符的第一个字符不能是数字:标识符不能为关键字. 基本数据类型多数与c语言相同.重点如下: 1.逻辑类型boolean赋值true/false 2.浮点数 ...