张世来4610484 发表于 2020-3-23 16:56:03

共用体

#include <stdio.h>
main()
{
        union A
        {
                struct
                {
                        int x;
                        int y;
                }in;
                int a;
                int b;
        }e;
        e.a=1;
        e.b=2;
        e.in.x=e.a*e.b;
        e.in.y=e.a+e.b;
        printf("%d %d",e.in.x,e.in.y);
}
这样的一段代码,输出结果为4,8;想问下8是怎么来的,e.a和e.b不都是2吗

sunrise085 发表于 2020-3-23 17:12:48

一个联合体,这么多的天了。你居然还没搞懂。。。。。。

#include <stdio.h>
main()
{
        union A
        {
                struct
                {
                        int x;
                        int y;
                }in;
                int a;
                int b;
        }e;//注意:共用体,共用同一单元,也就是说,in.x和a和b三个变量共用同样的单元
        e.a=1;//执行完这一句后,共用单元的值为1
        e.b=2;//执行完这一句后,共用单元的值为2
        e.in.x=e.a*e.b;//执行完这一句后,共用单元的值为2*2=4
        e.in.y=e.a+e.b;//执行完这一句后,共用单元的值为4+4=8
        printf("%d %d",e.in.x,e.in.y);
}

sunrise085 发表于 2020-3-23 17:15:02

你认真看过我之前在你的共用体的帖子中帮你画的图吗?
白白浪费了我的时间,你都不看。

Cool_Breeze 发表于 2020-3-23 17:40:57

联合类型的每个成员所分配的储存空间是从该联合的起始地址开始的。一个联合在任一时刻只能包含它的1个成员值。(第二次赋值时是2(2*2=4),相加又赋值一次是4(4+4=8),联合类型的对象的起始地址总是满足它所包含的任何成员的存储对齐要求(struct in (8个字节))所以sizeof(e)也是8个字节!

jackz007 发表于 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 个元素实际上是拥有三个不同标识符的同一个整型数,关于这一点,通过下面的代码很容易看出效果:
#include <stdio.h>
main()
{
      union A
      {
                struct
                {
                        int x                  ;
                        int y                  ;
                } in                           ;
                int a                            ;
                int b                            ;
      } e                                    ;
      e . a = 1234                           ;
      printf("e . in . x = %d\n" , e . in . x) ;
      printf("e . in . y = %d\n" , e . in . y) ;
      printf("e . a = %d\n" , e . a)         ;
      printf("e . b = %d\n" , e . b)         ;
      e . in . x = 5678                        ;
      printf("e . in . x = %d\n" , e . in . x) ;
      printf("e . in . y = %d\n" , e . in . y) ;
      printf("e . a = %d\n" , e . a)         ;
      printf("e . b = %d\n" , e . b)         ;
}
      编译、运行实况
C:\Bin>g++ -o x x.c

C:\Bin>x
e . in . x = 1234
e . in . y = 40099964
e . a = 1234
e . b = 1234
e . in . x = 5678
e . in . y = 40099964
e . a = 5678
e . b = 5678

C:\Bin>

张世来4610484 发表于 2020-3-23 21:20:55

sunrise085 发表于 2020-3-23 17:15
你认真看过我之前在你的共用体的帖子中帮你画的图吗?
白白浪费了我的时间,你都不看。

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

张世来4610484 发表于 2020-3-23 21:24:43

sunrise085 发表于 2020-3-23 17:12
一个联合体,这么多的天了。你居然还没搞懂。。。。。。

是不是可以理解成x,a,b共一段内存,而y加在x的后面的一段

sunrise085 发表于 2020-3-23 21:27:03

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

是的。就是这个意思。看我画的那个图。

张世来4610484 发表于 2020-3-23 21:30:16

sunrise085 发表于 2020-3-23 21:27
是的。就是这个意思。看我画的那个图。

谢谢,看懂了

jackz007 发表于 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 为代表,改写代码如下,使代码更容易理解:
#include <stdio.h>
main()
{
      union A
      {
                struct
                {
                        int x                     ;
                        int y                     ;
                }in                               ;
                int a                           ;
                int b                           ;
      } e                                       ;
      e . in . x = 1                            ; // e . a = 1
      e . in . x = 2                            ; // e . b = 2
      e . in . x = e . in . x * e . in . x      ; // e . in . x = e . a * e . b
      e . in . y = e . in . x + e . in . x      ; // e . in . y = e . a + e . b
      printf("%d %d" , e . in . x , e . in . y) ;
}

张世来4610484 发表于 2020-3-24 17:15:48

sunrise085 发表于 2020-3-23 17:12
一个联合体,这么多的天了。你居然还没搞懂。。。。。。

你快来看下我的问题

sunrise085 发表于 2020-3-24 17:26:54

张世来4610484 发表于 2020-3-24 17:15
你快来看下我的问题

???/

张世来4610484 发表于 2020-3-25 00:30:57

sunrise085 发表于 2020-3-24 17:26
???/

不用了,已经自己想通了,下次再叫你
页: [1]
查看完整版本: 共用体