内存对齐的问题了)。而对于union来说,在谭浩强的《C语言程序设计》中这么说:union变量所占用的内存长度等于最长的成员的内存长度。很显然,这是不对的,对于union所占用的内存大小,需要考虑内存对齐的问题。这就是为什么sizeof(union test)的值为4啦。

C中使用union

说的再好,再多,终归都是要在使用的,下面就好好的说说C中使用union。和struct一样,union只有先定义了共用体变量才能引用它。而且不能直接引用共用体变量,而只能引用共用体变量中的成员。就像我上面定义的union test。我们不能像下面这样直接引用union:

union test a;

printf("%d", a);

这种直接引用是错误的,由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。所以,应该写成下面这样:

printf("%d", a.mark);

同时,在使用union的时候,我们还需要注意以下的几点:

1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。

2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:

#include

using namespace std;

union test

{

char mark;

long num;

float score;

}a;

int main()

{

// cout<

a.mark = 'b';

cout<

cout<

cout<

a.num = 10;

cout<

cout<

cout<

a.score = 10.0;

cout<

cout<

cout<

return 0;

}

所以,在使用union的时候,要十二分的小心的。

3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。

4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。

5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。

按理说,总结到这里,C语言中的union也就没什么更多的要说了。但是,有一种东西叫做C++,在这个C++中有一种东西叫做类。

当union遇到对象

就单单C中的union,上面的总结已经够用了,但是,现在偏偏又有一个叫做C++的东西;当union遇到了C++中的对象时,一切又变得剪不断,理还乱。上面总结的union使用法则,在C++中依然适用。本来union本就是从C语言中的,如果我们在C++中继续按照C语言的那种方式使用union,那是没有问题的。如果我们在union中放一个类的对象呢?结果会怎么样?比如有以下代码:

#include

using namespace std;

class CA

{

int m_a;

};

union Test

{

CA a;

double d;

};

int main()

{

return 0;

}

可以看到,没有问题;如果我们在再类CA中添加了构造函数,或者添加析构函数,我们就会发现程序就会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

结束的话

我们都在玩那些高大上的东西,猛回头,发现身后却又一个大坑。打开尘封了多年的《C语言程序设计》(谭浩强著),小心翼翼的拭去封面上的尘土,思绪立刻被拉回到大一。那些年,我那清纯的大一。对大学的憧憬,对计算机的好奇,对编程的未知,就是这本书,这本该死的《C语言程序设计》,把我带上了“程序猿”这条不归路。说多了,都是泪,当你看我这篇文章时,你应该懂我的。CodeMonkey~~~,这条不归路,且行且珍惜。

===修改日志===

2014年9月11日 删除了文中“不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。”这样的描述,非常感谢Cassie_Lcy的指正,而且还在评论中附上了验证代码,非常感谢;同时,我也非常抱歉,对于这点没有验证过的知识,就进行了总结,对大家造成了一定的误导,sorry。一定要注重求学的严谨性。相关阅读:

Win10语音识别怎么关闭?Win10关闭语音识别的方法

Win8.1系统关闭Secure Boot安全启动后开机画面变红的故障原因及解决方法

Win10 Mobile 10.0.12609.0 新版曝光

Android编程实现ImageView图片抛物线动画效果的方法

js实现背景图片感应鼠标变化的方法

javascript学习笔记(四)function函数部分

C语言求Fibonacci斐波那契数列通项问题的解法总结

解析php取整的几种方式

ASP.NET OutputCache详解

javascript中匹配价格的正则表达式

javascript控制层显示或隐藏的方法

Linux下grep命令使用实例

PHP模拟post提交数据方法汇总

jquery根据锚点offset值实现动画切换

php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...相关推荐

  1. C语言 C++中的union用法总结(包懂)

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...

  2. 关于C语言编程中include的用法

    关于C语言编程中include的用法 1 iostream与iostream.h的区别: #include <iostream.h> // 这个就是1998年标准化以后的标准头文件 #in ...

  3. c1语言水平要多久,对普通人来说,一般需要多长时间才能学会一门外语?

    对普通人来说,一般需要多长时间才能学会一门外语? 外语学习,有人觉得容易,有人觉得难,总的来说,即使在互联网广泛普及,外语资料垂手可得的今天,外语学习对大多数人来讲,依然不是一件轻松的事,对许多正在学 ...

  4. c语言转义字符_C语言啊中的转义符有什么含义?

    其实所谓的换行符就是回车,在各类编程语言中换行符是很常见的,而转义字符是一种特殊的字符常量.转义字符以反斜线""开头,后跟一个或几个字符. 转义字符具有特定的含义,不同于字符原有的 ...

  5. 职高计算机专业c语言_C语言在中职计算机专业课程中的重要作用探究

    摘 要:在中职计算机教学中,C语言是计算机专业学生必备的基本技能之一,同时也是一门基础课程.C语言具有强大的功能和广泛的应用,在相关的科技领域中,已经日趋完善和发展.结合C语言的特点,进一步指出了C语 ...

  6. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  7. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  8. java SQLexists用法,mssql sql server where 中exists in 用法举例

    摘要: 下文讲述where子句中,in exists用法举例 in exists 功能简介: in exists:查询数据存在于表中的关键字 in exists:查询效率上 exists效率高于in ...

  9. java finally用法_深入浅析java中finally的用法

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下. 之前在写爬虫的时候数据 ...

最新文章

  1. C++/C++11中头文件numeric的使用
  2. 二分查找的循环实现和递归实现
  3. python的中文含义-python __all__ 含义
  4. Blog博客系统数据库设计
  5. Lazy FP状态还原漏洞公布,大多数Intel的酷睿CPU受其影响
  6. div高度、宽度100% div width、height 100%
  7. python实现文件上传和下载_[Python] socket实现TFTP上传和下载
  8. 10万人的大场馆如何“画座位”?
  9. 最全Pycharm教程
  10. 传授电脑蓝屏开不了机怎么办
  11. .NET的轻量级IOC框架芮双随笔
  12. python的本地包下载地址
  13. 2017.6.4 problem b 失败总结
  14. 如何在局域网上托管ASP.NET Web应用程序
  15. leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays
  16. php小数乘法,三 小数乘法精品|小学数学,北师大版,四年级下册,数学精品下载_21精品_21世纪教育网...
  17. 【 Codeforces Round #552 (Div. 3) G】Minimum Possible LCM【埃氏筛】
  18. 括号里面一个上面一个数下面一个数符号怎么打?/ 概率论组合符号怎么打?
  19. fedora 19 安装中文语言包
  20. Python-GeoPandas地图、专题地图绘制

热门文章

  1. 【有限元分析】网格形状和网格尺寸对结果的影响——以矩形杆的静力分析为例
  2. 开源IoT操作系统Mynewt使用简介
  3. C++中的delegate
  4. 2021春深入理解计算机系统大作业——程序人生
  5. 事务的传播级别(行为)
  6. linux如何给脚本等创建一个桌面启动图标
  7. 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
  8. 循环冗余校验码例题[转帖]
  9. nvcc -V和nvidia-smi中的cuda版本不同
  10. OSI七层网络模型详解!