共用体知识总结
来源:互联网 发布:无锡紫光软件培训中心 编辑:程序博客网 时间:2024/06/15 21:18
提起结构体,我们可以想到它的一些特性,定义一个结构体,我们可以给其中放上不同类型的数据,他们分别占用不同的存储空间,所以一个结构体的数据所占内存就是各个数据的内存之和,这里还涉及到了内存对齐的问题,我在专门写结构体的那篇博客里面已经说过了,这里就不在赘述了。其实,还有一个和结构体很相似的内存类型,共用体。
一看到它的名字,我们或许就已经知道一些 它的特性了,没错,它和结构体很相像,也可以在其中放入不同类型的数据,但是,有一个不同的地方就是,在共用体当中的数据共用这一段内存空间,所以,他们的存储地址都是相同并且固定不变的,刚刚接触到这个概念,其实我也很是迷惑,这到底应该如何存放数据呢,如果放进去三个数据甚至更多,这么大的数据内存空间更本就不够用啊,直到我更深入的了解到这个类型时,我才发觉到,共用体的设计真是太巧妙了,我在下面讲一讲我的理解吧。
共用体确实是占用同一段内存空间,但是需要知道的是,整个内存空间必须是占用内存最大的数据的空间大小,这样才能保证数据可以正确的放在里面而不至于数据丢失。
假设定义一个共用体如下
共用体的几个特点
一看到它的名字,我们或许就已经知道一些 它的特性了,没错,它和结构体很相像,也可以在其中放入不同类型的数据,但是,有一个不同的地方就是,在共用体当中的数据共用这一段内存空间,所以,他们的存储地址都是相同并且固定不变的,刚刚接触到这个概念,其实我也很是迷惑,这到底应该如何存放数据呢,如果放进去三个数据甚至更多,这么大的数据内存空间更本就不够用啊,直到我更深入的了解到这个类型时,我才发觉到,共用体的设计真是太巧妙了,我在下面讲一讲我的理解吧。
共用体确实是占用同一段内存空间,但是需要知道的是,整个内存空间必须是占用内存最大的数据的空间大小,这样才能保证数据可以正确的放在里面而不至于数据丢失。
假设定义一个共用体如下
union{ int i; char ch; float f;}a,b,c;
共用体的几个特点
1.共用体总是存储最后一个数据的值,因为在共用体中每一瞬间只能存放其中一个成员,而不是同时存放几个。为什么会是这样呢,浅显的说,在每一个存储的瞬间,存储单元只能有唯一的内容,在共用体变量中只能存一个值,所以可以说是共用体存在内存覆盖,不管有多少个数据,只会存放最后一个元素的值,原有的值会被取代。
2.由于共用体的第一个性质,所以对共用体进行初始化的时候,在初始化表中只能有一个变量,我在下面举几个例子
2.由于共用体的第一个性质,所以对共用体进行初始化的时候,在初始化表中只能有一个变量,我在下面举几个例子
union Data{ int i; char ch; float f;}a={1,'a',1.5}; //错了,占用同一段存储单元union Data a={16}; //正确,对第一个成员进行初始化union Data a={.ch='j'}; //可以对指定的成员进行初始化
3.不能对共用体进行赋值,也不能通过引用变量名来得到一个值
举两个错误的例子
1.a=1 这样不知道给哪一个赋值,所以错了
2.m=a 不能通过引用变量名得到一个值赋给整型变量m
但是,可以对两个同类型的共用体进行赋值
比如 a=b; 这样是完全可以的,这一点又和结构体有异曲同工之妙
特别注意
只有先定义了共用体变量才可以引用它,但是,不能引用共用体变量,只能引用共用体变量中的成员
a.i (引用共用体变量中的整型变量i)
a.ch (引用共用体变量中的字符变量ch)
a.f (引用共用体变量中的实型变量f)
举两个错误的例子
1.a=1 这样不知道给哪一个赋值,所以错了
2.m=a 不能通过引用变量名得到一个值赋给整型变量m
但是,可以对两个同类型的共用体进行赋值
比如 a=b; 这样是完全可以的,这一点又和结构体有异曲同工之妙
特别注意
只有先定义了共用体变量才可以引用它,但是,不能引用共用体变量,只能引用共用体变量中的成员
a.i (引用共用体变量中的整型变量i)
a.ch (引用共用体变量中的字符变量ch)
a.f (引用共用体变量中的实型变量f)
阅读全文
0 0
- 共用体知识总结
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 共用体
- 浅谈函数的调用过程,栈帧的创建和销毁
- pat 乙级 1015. 德才论 (25) c++
- 初始MQTT协议(3)
- 数据结构之--堆(Java代码)
- MVC, MVP, MVVC 模式整理
- 共用体知识总结
- java第一篇:使用jdbc进行关联查询以及java开发常见问题
- CodeForces 146C(脑洞)
- Java 之 序列化和反序列化的工具类
- OpenGLES2.0基础(3)
- vim常用命令总结
- Coursera deeplearning.ai 深度学习习题1-3-Shallow Neural Networks
- 简单介绍Android四大组件
- MySql学习--查看数据表结构