union--一道经典的C++笔试题 .

转:http://blog.csdn.net/rjw1900/article/details/6402023

[c-sharp] view plaincopyprint?

  1. #i nclude <stdio.h>  
  2. union  
  3. {  
  4. int i;  
  5. char x[2];  
  6. }a;  
  7.   
  8. void main()  
  9. {  
  10. a.x[0] = 10;  
  11. a.x[1] = 1;  
  12. printf("%d",a.i);  
  13. }  
  14. 答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)  
  15. b)  
  16. main()  
  17. {  
  18. union{ /*定义一个联合*/  
  19. int i;  
  20. struct/*在联合中定义一个结构*/  
  21. char first;  
  22. char second;  
  23. }half;  
  24. }number;  
  25. number.i=0x4241; /*联合成员赋值*/  
  26. printf("%c%c/n", number.half.first, mumber.half.second);  
  27. number.half.first='a'/*联合中结构成员赋值*/  
  28. number.half.second='b';  
  29. printf("%x/n", number.i);  
  30. getch();  
  31. }  
  32. 答案: AB (0x41对应'A',是低位;Ox42对应'B',是高位)  
  33. 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

posted on 2012-10-04 22:36  Paul_bai  阅读(2023)  评论(0编辑  收藏  举报

导航