union 关键字的用法与struct

时间:2022-09-05 16:33:55
联合(union)
********************************************************************
1.union 维护足够的空间来置放多个数据成员,而不是为每一个数据成员配置
        空间,在union 中所有的数据成员共用一个空间,同一时间只能储存
        其中一个数据成员,所有的数据成员具有相同的起始地址。


       union StateMachine
      {
         char character;
         int number;
         char *str;
         double exp;
      };


   @@一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,
     以上例而言,最大长度是double 型态,所以StateMachine 的空间大小
     就是double 数据类型的大小。


     @在C++里,union 的成员默认属性页为public。union 主要用来压缩空间
      。如果一些数据不可能在同一时间同时被用到,则可以使用union。


2.考虑存储模式:大端模式和小端模式。
    **大端模式(Big_endian):
     字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。


    **小端模式(Little_endian):
     字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。


  @@union 型数据所占的空间等于其最大的成员所占的空间。对union 型的
    成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是
    联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。


3.序确认当前系统的存储模式
  **写一个C 函数,若处理器是Big_endian 的,则返回0;
                  若是Little_endian 的,则返回1。


4.例如
         union
         {
             int i;
             char a[2];
          }*p, u;


    @@ int i=1;


      大端模式 0x0  0x0 0x0 0x1 
                     ——————————>高地址


      小端模式 0x0  0x0 0x0 0x1 
                     ——————————>低地址




*******************************************************************
结构(struct)
*******************************************************************
1.结构体在函数中的作用不是简便,其最主要的作用就是封装。
  封装的好处就是可以再次利用。让使用者不必关心这个是什么,
  只要根据定义使用就可以了。


2.在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会
  相对更高效,这就是内存对齐的由来。
  特定平台上的编译器都有自己的默认“对齐系数”


3.在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。
  @ 在C语言中,结构体不能包含函数。


    ***************************************************************
   * 在面向对象的程序设计中,对象具有状态(属性)和行为,
   * 状态保存在成员变量中,行为通过成员方法(函数)来实现。
   * C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。
   * 在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,
   * C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,
   *****************************************************************
     与class不同的是,结构体包含的函数默认为public,而不是private。


4.它是由不同类型的数据组合成一个整体。
      struct 结构体类型名      //结构体类型的标志
  {
        类型名 成员名;      //成员列表( 成员列表称为 域表)
                            //称为结构体中的一个域
     };


     @@只是指定了一个结构体类型,它相当于一个模型,但其中并无具体数据
       系统对之也不分配实际内存单元


5.当定义结构体类型的变量,并在其中存放具体的数据


     三种方法
     (1)先声明结构体类型再定义变量名
     (2)在声明类型的同时定义变量
   (3)直接定义结构类型变量(stm32 )
           其一般形式为
          struct
          {
           成员表列
           }变量名表列;
            即不出现结构体名。