联合定义
是一种特殊的自定义类型,它包含一系列的成员,特征是这些成员共用同一块空间(因此联合也叫共用体)
联合特点
(1)0联合的成员共用同一块内存空间,因此联合变量的大小,至少是最大成员的大小(因为联合的空间大小至少能存放最大的成员)
(2)由于联合的成员共用同一块空间,所以修改一个成员变量的值时,另外一个成员变量的值也会被修改,如修改i时会把c也修改了;同理,修改c时i也会被修改。
联合大小的计算
(1)联合的大小至少是最大成员的大小。
(2)当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<stdio.h> 3. union Un 4. { 5. char c;//1 6. int i;//4 7. }; 8. 9. union Un2 10. { 11. char c[5];//5 12. int i;//4 13. }; 14. 15. union Un3 16. { 17. char c[5];//1 5 18. char ch;//1 19. }; 20. 21. union Un4 22. { 23. short s[5];//2 10 24. int i;//4 25. }; 26. 27. int main() 28. { 29. union Un u = { 67 }; 30. 31. //联合的大小至少是最大成员的大小 32. printf("%d\n", sizeof(u));//4 成员c的最大对齐数是1,成员i的最大对齐数4,因此联合变量u的最大对齐数是4,且大小是4的整数倍,因此大小为4 33. 34. //联合的成员共用同一块空间 35. printf("%p\n", &u);//0055F888 36. printf("%p\n", &(u.c));//0055F888 37. printf("%p\n", &(u.i));//0055F888 38. 39. printf("%c\n", u.c);//C 40. printf("%d\n", u.i);//67 41. 42. //修改i时,c会被修改 43. u.i = 68 ; 44. 45. printf("%c\n", u.c);//D 46. printf("%d\n", u.i);//68 47. 48. //修改c时,i会被修改 49. u.c = 'E'; 50. 51. printf("%c\n", u.c);//D 52. printf("%d\n", u.i);//69 53. 54. 55. union Un2 u2 = { 'A','B','C','D','E'}; 56. printf("%d\n", sizeof(u2));//8 成员c的最大对齐数是1,大小是5,成员i的最大对齐数4,因此联合变量u2的最大对齐数是4,大小至少是5,且大小是4的整数倍,因此大小为8 57. 58. union Un3 u3 = { 'A','B','C','D','E' }; 59. printf("%d\n", sizeof(u3));//5 成员c的最大对齐数是1,大小是5,成员ch的最大对齐数为1,因此联合变量u3的最大对齐数是1,大小至少是5,且大小是1的整数倍,因此大小为5 60. 61. union Un4 u4 = { 1, 2, 3, 4, 5 }; 62. printf("%d\n", sizeof(u4));//12 成员s的最大对齐数是2,大小是10,成员i的最大对齐数为4,因此联合变量u4的最大对齐数是2,大小至少是10,且大小是4的整数倍,因此大小为12 63. 64. return 0; 65. }