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: //目的地

测试代码笔记如下:

 1 #include<stdio.h>
 2 
 3 struct MyStruct  //结构体
 4 {
 5     int a;
 6     float b;
 7     double c;
 8 };
 9 
10 union MyUnion  //联合  优点一验证
11 {
12     int a;
13     float b;
14     double c;
15 };
16 
17 union Myint  //联合  优点二验证
18 {
19     int a;
20     char arr[4];
21 
22 };
23 
24 enum map  //枚举的示例1
25 {
26     wall,people,box,aim  //墙 人 箱子 目的地
27 };
28 
29 enum dir  //方向键枚举
30 {
31     UP,DOWN,LIEFT,RIGHT
32 };
33 
34 int main()
35 {
36 #if 0
37     //-------------------结构体--------------------
38     
39     struct MyStruct oug;
40     oug.a = 1;
41     oug.b = 2;
42     oug.c = 3;
43     printf("结构体输出结果:%d    %f    %lf
    结构体大小:%d
", oug.a, oug.b, oug.c,sizeof(oug));
44 #endif
45 
46     //--------------------联合----------------------
47 #if 0    
48     //联合的第一优点示例
49     union MyUnion danny;
50     danny.a = 1;//在给.b赋值之前是一直有效的  以下同理
51     danny.b = 2;
52     danny.c = 3.141592654;
53     printf("联合的输出结果:%d    %f    %.10lf
    联合的大小:%d
", danny.a,danny.b,danny.c,sizeof(danny));  //%.10lf  格式占位符 控制输出数据的精度   printf中%f %lf 没有区别的
54     //乱码的定义 输出不符合预期的都是乱码
55 #endif    
56 
57 #if 0    
58     //联合的第二优点示例  (共用内存!=共用值)
59     union Myint test;   
60     test.a= 0x414243;//(65的十六进制是41 在ASCII码中65是A)
61     printf("打印结果%s
", test.arr);  //结果是CBA
62     printf("打印结果%d
", test.a);  //结果是414243
63 
64 #endif    
65 
66     //--------------------枚举----------------------
67 #if 1
68     //枚举的示例1
69     enum map point;  //枚举变量
70     point = box;  //赋值 赋已经列举所有值
71     switch (point)  //在vs中使用table键 用switch方式可以自动列举出所有的值
72     {
73     case wall:
74         break;
75     case people:
76         break;
77     case box:
78         break;
79     case aim:
80         break;
81     default:
82         break;
83     }
84     printf("wall=%d
", wall);
85     printf("people=%d
", people);
86     printf("box=%d
", box);
87     printf("aim=%d
", aim);
88 
89 #endif
90 
91     getchar();
92     return 0;
93 }

附:

2019-03-28  10:22:21

原文地址:https://www.cnblogs.com/Yuuki-/p/10613244.html