第一章:关键字
union 关键字
知识点一: 在union中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有数据成员具有相同的起始地址。例如:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一个union只配置一个足够大的空间来容纳最大长度的数据成员,以本例而言,最大长度是double类型,所以StateMachine的空间大小就是double数据类型的大小。
知识点二: 大小端模式对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的首地址位置开始的。
由此可看出:p.i的值应该为0x39
知识点三:如何用程序确认当前系统的存储模式
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的则返回1;
先分析一下,按照上面关于大小端的定义,假设int类型变量i被初始化为1.
以大端模式存储,其内存布局如图:
大端模式:int i=1;
0x0 | 0x0 | 0x0 | 0x1 |
------------------------------------------------->高地址
小端模式: int i=1;
0x1 | 0x0 | 0x0 | 0x0 |
------------------------------------------------->高地址
变量i 占4个字节,但只有1个字节的值为1,另外3个字节的值都为0;如果取出低地址上的值为0,这是大端模式;如果取出的低地址上的值为1,这是小端模式;
所以我们利用union类型数据“所有成员的起始地址一致性”的特点编写程序。
参考如下:
int checkSystem()
{
union check
{
int i;
char ch;
} c;
c.i =1;
return (c.ch==1);//这句我觉得写得很高水平,如果是小端模式则c.ch为1,那么c.ch==1这个判断是正确的返回1。如果是大端模式返回0;
}