丁香园做科室网站,学平面设计怎么样啊,系统开发软件有哪些,提升网页优化排名union #xff08; 共用体#xff09;#xff1a;构造数据类型,也叫联合体 用途#xff1a;使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 )#xff1a;是一种构造类型 用途#xff1a; 把不同的数据组合成一个整体——自定义数据类型 主要区别#x… union 共用体构造数据类型,也叫联合体 用途使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 )是一种构造类型 用途 把不同的数据组合成一个整体——自定义数据类型 主要区别 1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员; 而struct的所有成员都存在。在struct中各成员都占有自己的内存空间它们是同时存在的,一个struct变量的总长度等于所有成员长度之和遵从字节对其原则; 在Union中所有成员不能同时占用它的内存空间它们不能同时存在 , Union变量的长度等于最长的成员的长度。 2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,所以共同体变量中起作用的成员是最后一次存放的成员; 而对于struct的不同成员赋值是互不影响的。 union 维护足够的空间来置放多个数据成员中的“一种”而不是为每一个数据成员配置空间在union 中所有的数据成员共用一个空间同一时间只能储存其中一个数据成员所有的数据成员具有相同的起始地址。例子如下 union StateMachine { char character; int number; char *str; double exp; }; 一个union 只配置一个足够大的空间以来容纳最大长度的数据成员以上例而言最大长度是double 型态所以StateMachine 的空间大小就是double 数据类型的大小。 在C里union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到则可以使用union。 一、大小端模式对union 类型数据的影响 下面再看一个例子 union { int i; char a[2]; }*p, u; p u; p-a[0] 0x39; p-a[1] 0x38; p.i 的值应该为多少呢 这里需要考虑存储模式大端模式和小端模式。 大端模式Big_endian字数据的高字节存储在低地址中而字数据的低字节则存放在高地址中。 小端模式Little_endian字数据的高字节存储在高地址中而字数据的低字节则存放在低地址中。 union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。如此一解释上面的问题是否已经有了答案呢 二、如何用程序确认当前系统的存储模式 上述问题似乎还比较简单那来个有技术含量的请写一个C 函数若处理器是Big_endian 的则返回0若是Little_endian 的则返回1。 先分析一下按照上面关于大小端模式的定义假设int 类型变量i 被初始化为1。 以大端模式存储其内存布局如下图 以小端模式存储其内存布局如下图 变量i 占4 个字节但只有一个字节的值为1另外三个字节的值都为0。如果取出低地址上的值为0毫无疑问这是大端模式如果取出低地址上的值为1毫无疑问这是小端模式。既然如此我们完全可以利用union 类型数据的特点所有成员的起始地址一致。 到现在应该知道怎么写了吧参考答案如下 int checkSystem( ) { union check { int i; char ch; } c; c.i 1; return (c.ch 1); } 现在你可以用这个函数来测试你当前系统的存储模式了。当然你也可以不用函数而直接去查看内存来确定当前系统的存储模式。如下图 图中0x01 的值存在低地址上说明当前系统为小端模式