鱼C论坛

 找回密码
 立即注册
查看: 913|回复: 12

[已解决]共用体

[复制链接]
发表于 2020-3-23 16:56:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. main  ()
  3. {
  4.         union A
  5.         {
  6.                 struct
  7.                 {
  8.                         int x;
  9.                         int y;
  10.                 }in;
  11.                 int a;
  12.                 int b;
  13.         }e;
  14.         e.a=1;
  15.         e.b=2;
  16.         e.in.x=e.a*e.b;
  17.         e.in.y=e.a+e.b;
  18.         printf("%d %d",e.in.x,e.in.y);
  19. }
复制代码

这样的一段代码,输出结果为4,8;想问下8是怎么来的,e.a和e.b不都是2吗
最佳答案
2020-3-23 17:50:10
本帖最后由 jackz007 于 2020-3-23 17:56 编辑

         在这个共用体 e 中,一共有 3 个元素,e . in、e . a、e . b,既然是共用体,那么,这 3 个元素实际上是指向同一个内存地址的。3 个元素中,比较特殊的是 e . in,它是一个结构,这个结构含有 2 个 int 成员,实际上可以视为一个有 2 个元素的一维整型数组,这样的话,共用体 e 指向相同地址的 3 个元素分别是 e . in . x、e . a、e . b,就是说,这 3 个元素实际上是拥有三个不同标识符的同一个整型数,关于这一点,通过下面的代码很容易看出效果:
  1. #include <stdio.h>
  2. main  ()
  3. {
  4.         union A
  5.         {
  6.                 struct
  7.                 {
  8.                         int x                    ;
  9.                         int y                    ;
  10.                 } in                             ;
  11.                 int a                            ;
  12.                 int b                            ;
  13.         } e                                      ;
  14.         e . a = 1234                             ;
  15.         printf("e . in . x = %d\n" , e . in . x) ;
  16.         printf("e . in . y = %d\n" , e . in . y) ;
  17.         printf("e . a = %d\n" , e . a)           ;
  18.         printf("e . b = %d\n" , e . b)           ;
  19.         e . in . x = 5678                        ;
  20.         printf("e . in . x = %d\n" , e . in . x) ;
  21.         printf("e . in . y = %d\n" , e . in . y) ;
  22.         printf("e . a = %d\n" , e . a)           ;
  23.         printf("e . b = %d\n" , e . b)           ;
  24. }
复制代码

        编译、运行实况
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. e . in . x = 1234
  4. e . in . y = 40099964
  5. e . a = 1234
  6. e . b = 1234
  7. e . in . x = 5678
  8. e . in . y = 40099964
  9. e . a = 5678
  10. e . b = 5678

  11. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-23 17:12:48 | 显示全部楼层
一个联合体,这么多的天了。你居然还没搞懂。。。。。。

  1. #include <stdio.h>
  2. main  ()
  3. {
  4.         union A
  5.         {
  6.                 struct
  7.                 {
  8.                         int x;
  9.                         int y;
  10.                 }in;
  11.                 int a;
  12.                 int b;
  13.         }e;//注意:共用体,共用同一单元,也就是说,in.x和a和b三个变量共用同样的单元
  14.         e.a=1;//执行完这一句后,共用单元的值为1
  15.         e.b=2;//执行完这一句后,共用单元的值为2
  16.         e.in.x=e.a*e.b;//执行完这一句后,共用单元的值为2*2=4
  17.         e.in.y=e.a+e.b;//执行完这一句后,共用单元的值为4+4=8
  18.         printf("%d %d",e.in.x,e.in.y);
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 17:15:02 | 显示全部楼层
你认真看过我之前在你的共用体的帖子中帮你画的图吗?
白白浪费了我的时间,你都不看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 17:40:57 | 显示全部楼层
联合类型的每个成员所分配的储存空间是从该联合的起始地址开始的。一个联合在任一时刻只能包含它的1个成员值。(第二次赋值时是2(2*2=4),相加又赋值一次是4(4+4=8),联合类型的对象的起始地址总是满足它所包含的任何成员的存储对齐要求(struct in (8个字节))所以sizeof(e)也是8个字节!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 17:50:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-23 17:56 编辑

         在这个共用体 e 中,一共有 3 个元素,e . in、e . a、e . b,既然是共用体,那么,这 3 个元素实际上是指向同一个内存地址的。3 个元素中,比较特殊的是 e . in,它是一个结构,这个结构含有 2 个 int 成员,实际上可以视为一个有 2 个元素的一维整型数组,这样的话,共用体 e 指向相同地址的 3 个元素分别是 e . in . x、e . a、e . b,就是说,这 3 个元素实际上是拥有三个不同标识符的同一个整型数,关于这一点,通过下面的代码很容易看出效果:
  1. #include <stdio.h>
  2. main  ()
  3. {
  4.         union A
  5.         {
  6.                 struct
  7.                 {
  8.                         int x                    ;
  9.                         int y                    ;
  10.                 } in                             ;
  11.                 int a                            ;
  12.                 int b                            ;
  13.         } e                                      ;
  14.         e . a = 1234                             ;
  15.         printf("e . in . x = %d\n" , e . in . x) ;
  16.         printf("e . in . y = %d\n" , e . in . y) ;
  17.         printf("e . a = %d\n" , e . a)           ;
  18.         printf("e . b = %d\n" , e . b)           ;
  19.         e . in . x = 5678                        ;
  20.         printf("e . in . x = %d\n" , e . in . x) ;
  21.         printf("e . in . y = %d\n" , e . in . y) ;
  22.         printf("e . a = %d\n" , e . a)           ;
  23.         printf("e . b = %d\n" , e . b)           ;
  24. }
复制代码

        编译、运行实况
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. e . in . x = 1234
  4. e . in . y = 40099964
  5. e . a = 1234
  6. e . b = 1234
  7. e . in . x = 5678
  8. e . in . y = 40099964
  9. e . a = 5678
  10. e . b = 5678

  11. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-23 21:20:55 | 显示全部楼层
sunrise085 发表于 2020-3-23 17:15
你认真看过我之前在你的共用体的帖子中帮你画的图吗?
白白浪费了我的时间,你都不看。

看了,但是不懂“共用同一单元,也就是说,in.x和a和b三个变量共用同样的单元”,为什么是in.x,in.y呢,还有我把
  1. e.in.x=e.a*e.b;
  2.         e.in.y=e.a+e.b;
复制代码

换成
  1. e.in.y=e.a*e.b;
  2.         e.in.x=e.a+e.b;
复制代码

就是4,4了,为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-23 21:24:43 | 显示全部楼层
sunrise085 发表于 2020-3-23 17:12
一个联合体,这么多的天了。你居然还没搞懂。。。。。。

是不是可以理解成x,a,b共一段内存,而y加在x的后面的一段
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 21:27:03 | 显示全部楼层
张世来4610484 发表于 2020-3-23 21:24
是不是可以理解成x,a,b共一段内存,而y加在x的后面的一段

是的。就是这个意思。看我画的那个图。
4.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-23 21:30:16 | 显示全部楼层
sunrise085 发表于 2020-3-23 21:27
是的。就是这个意思。看我画的那个图。

谢谢,看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 21:40:29 | 显示全部楼层
张世来4610484 发表于 2020-3-23 21:24
是不是可以理解成x,a,b共一段内存,而y加在x的后面的一段

        这道题的知识要点是 e . in . x 与 e . a 及 e . b 公用同一个变量空间,说白了,这三个变量其实就是同一个变量,于是,以 e . in . x 为代表,改写代码如下,使代码更容易理解:
  1. #include <stdio.h>
  2. main  ()
  3. {
  4.         union A
  5.         {
  6.                 struct
  7.                 {
  8.                         int x                     ;
  9.                         int y                     ;
  10.                 }in                               ;
  11.                 int a                             ;
  12.                 int b                             ;
  13.         } e                                       ;
  14.         e . in . x = 1                            ; // e . a = 1
  15.         e . in . x = 2                            ; // e . b = 2
  16.         e . in . x = e . in . x * e . in . x      ; // e . in . x = e . a * e . b
  17.         e . in . y = e . in . x + e . in . x      ; // e . in . y = e . a + e . b
  18.         printf("%d %d" , e . in . x , e . in . y) ;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 17:15:48 | 显示全部楼层
sunrise085 发表于 2020-3-23 17:12
一个联合体,这么多的天了。你居然还没搞懂。。。。。。

你快来看下我的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 17:26:54 | 显示全部楼层
张世来4610484 发表于 2020-3-24 17:15
你快来看下我的问题

???/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 00:30:57 | 显示全部楼层

不用了,已经自己想通了,下次再叫你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表