c/c++语言开发共享如何在C语言中使用Union

我对C语言中的联合有疑问。 在联合中声明的变量将共享相同的内存,好吧,我明白了。 例如,

union student { int i; int j; }x; 

我们怎么能访问i和j? 如果我们有:xi = 1; 然后我们printf("%d",j); 会发生什么? 编译错误? 那么以下情况呢?

 union student { int i; float j; }x; 

如果我们指定xi = 2; xj的价值是多少?

    假设你使用

     printf("%d", xj); 

    您将看到为xi指定的相同值,因为两个变量都占用相同的内存区域。 像你所做的那样,将两个变量设置为相同类型并不典型。 更典型的是,您可以这样做,以便您可以查看相同的数据,但可以查看不同的数据类型。

    想象一下,例如,您希望将doubledouble都视为double ,有时直接访问表示double的位(1和0),您可以使用以下union来实现。

     union DoubleData { double d; char b[8]; } x; 

    现在,您可以直接通过d成员分配/访问double,或者通过代表内存中double的8个字节来操作相同的值。

    使用您最近的问题更新,

     union student { int i; float j; }x; 

    让我们对你的平台做一个假设, int是4个字节, float是4个字节。 在这种情况下,当您访问xj您将操作并将4个字节视为double,当您访问xi您将操作并将4个字节视为整数。

    因此,两个变量都覆盖在相同的内存区域中,但不同之处在于您如何解释该内存区域中的位模式。 请记住,任何4字节位模式都是有效的int,但不是任何4字节位模式都是有效的浮点数。

    让我们对你的平台做另一个假设,int是2个字节,float是4个字节。 在这种情况下,当您访问xi您将只操作浮点覆盖的位模式的一半,因为在这种情况下xi仅部分覆盖xj因为xj覆盖更多字节。

    ij都将共享相同的内存,因此无论你分配给一个内存,其他成员都可以使用。

     xi = 1; // xj = 1 

    这是“未定义的行为”。

    你可能不会写给i然后从j读。 您一次只能“使用”其中一个元素。

      以上就是c/c++开发分享如何在C语言中使用Union相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560380.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐