zoukankan      html  css  js  c++  java
  • C/C++ union

    叙述原因:

    union data{

    int a;
    double b;
    };

    对于union,实际中用的并不多,之前也知道怎样计算union的单元(在字对齐的基础上取最大成员所占的内存大小),比如

    union data{

    int a;
    char b[5];
    };  最大为5个字节,但为了字对齐,需要是4的倍数,sizeof(data)大小就是8,其他复杂的结构大家可以网上搜一搜,一般考的可能就是这样。

    问题1:

    union各数据单元的内存地址是否相同?

    本人设想拥有最大元素的内存单元,那么各元素的地址是相同的。结果也验证了正确性。

    union data{

    int a;
    char b;
    double c;
    char ch[5];
    }; 

    union data d;
    d.a = 10;
    printf("%d %d %d %d ",&d,&d.a,&d.b,&d.c,d.ch); 4个结果全部相同。

    问题2:

    union data{

    int a;
    double b;
    }; 如果设置了d.a = 10,那么d.b = ???

    是不是有点蒙?如果按照 内存地址相同,说明是共享了同一块数据单元, d.b的值应该也是 10

    但是 d.b != 10 。

    同理如果设置了d.b = 10,那么d.a =?? 结果是d.a = 0 

    但是对于特殊情况,如果data的结构是

    union data{

    int a;
    char b;
    }; 

     如果设置了d.a = 10,那么d.b =??? 其实这个时候 a.b = 10 原因是 这两个类型在C语言中的内存结构是一样的,但是 int float double却不相同。

    这也就是要强调 对于结构体你用的什么赋值,就采用哪一个变量,否则值可能得不到。。

    我的想法是: 他们内存的数据是一样,但是不同类型读取数据的方式不同,导致了数据与赋值数据不同。主要是数据的读取方式和对内存数据的组织方式

  • 相关阅读:
    pat00-自测5. Shuffling Machine (20)
    Spiral Matrix
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Best Time to Buy and Sell Stock II
    4Sum
    3Sum Closest
    3Sum
    MySQL存储过程、函数和游标
    Word Ladder
  • 原文地址:https://www.cnblogs.com/ShalenChe/p/5377160.html
Copyright © 2011-2022 走看看