长沙网站建设服务,wordpress添加博客栏目,福州市网站,下载上海发布官方网站union 关键字的用法与struct 的用法非常类似。union 维护足够的空间来置放多个数据成员中的“一种”#xff0c;而不是为每一个数据成员配置空间#xff0c;在union 中所有的数据成员共用一个空间#xff0c;同一时间只能储存其中一个数据成员#xff0c;所有的数据成员具有…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 的值存在低地址上说明当前系统为小端模式。不过要说明的一点是某些系统可能同时支持这两种存储模式你可以用硬件跳线或在编译器的选项中设置其存储模式。留个问题在x86 系统下输出的值为多少#include stdio.hintmain(){int a[5]{1,2,3,4,5};int *ptr1(int *)(a1);int *ptr2(int *)((int)a1);printf(%x,%x,ptr1[-1],*ptr2);return 0;}