union--一道经典的C++笔试题 .
转:http://blog.csdn.net/rjw1900/article/details/6402023
[c-sharp] view plaincopyprint?
- #i nclude <stdio.h>
- union
- {
- int i;
- char x[2];
- }a;
- void main()
- {
- a.x[0] = 10;
- a.x[1] = 1;
- printf("%d",a.i);
- }
- 答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
- b)
- main()
- {
- union{ /*定义一个联合*/
- int i;
- struct{ /*在联合中定义一个结构*/
- char first;
- char second;
- }half;
- }number;
- number.i=0x4241; /*联合成员赋值*/
- printf("%c%c/n", number.half.first, mumber.half.second);
- number.half.first='a'; /*联合中结构成员赋值*/
- number.half.second='b';
- printf("%x/n", number.i);
- getch();
- }
- 答案: AB (0x41对应'A',是低位;Ox42对应'B',是高位)
- 6261 (number.i和number.half共用一块地址空间)
union中的各个成员共用一块内存,而且这块内存的大小是和union中占空间最大的元素所占空间一样大(例如上边T1,sizeof(a)=4)
而且对union中不同成员的写操作,会覆盖其他成员的值
T1:
main函数中对union变量a中的数组X进行赋值,由于会分配4个字节的空间,但是x只占用了两个字节的空间,而且在赋值时从低地址开始,
所以a在内存中的分布是这样的:
从高位到低位读也就是0x00 00 01 0A 注意:低位两个字节是01 0A 不是10 A0(我就是当时把这个搞错了。。)
当输出a.i时,由于占用同样一块内存,所以会读出四个字节,转换为10进制也就是266
还有一个误区就是:10在16进制中是A,但是A只有4位,但是一个字节有八位,在高位添0,所以10在内存中是0A,而不是A(当时我也搞错了。。。)
T2:
union中有两个变量,一个int i 占四个字节,一个结构体,占两个字节,所以这个union占有四个字节的内存
当给i赋值后内存中是这样的:
当输出结构体中的成员时:
printf("%c%c/n", number.half.first, mumber.half.second);
第一个字节(也就是0x41)被赋给 number.half.first,第二个字节(0X42)被赋给 number.half.second
于是分别输出了AB
当给结构体中的元素赋值后:
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
‘a‘=0x61,’b‘=0x62
内存中是这样的:
当输出i的时候,把四个字节都读出来
用十六进制输出就是0X00 00 62 61也就是6261