• Union联合体


    一. union的声明和struct类似

    1 union 名称 {
    2     //成员变量
    3 };
    4 
    5 typedef union {
    6     //成员变量
    7 }名字;

      

    二. 内存分配

    1. union内存大小需要满足以下2个条件:

      1> 大于或等于union中最长的成员变量的长度;

      2> 能整除其他成员变量长度

    文字描述计算过程:U001中的成员变量 int number->4字节,char c[10]->10字节,double tmp->8字节,  要大于或等于10,还需要能整除4和8,U001的大小为16字节

     

    2. union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值

     

    3. 判断union起始地址是低地址还是高地址

    从Log可以看出c[0]地址小于c[1],所以在我的机子上,union起始地址是低地址,即小端little-endian

    4. union怎么存储和读取成员变量的值

    ASCII字符‘A’对应16进制41、10进制65,‘B’对应16进制42、10进制66,'C'对应16进制43、10进制67, 'D'对应16进制44、10进制68

    char类型1个字节,int4个字节,给联合体实例u1的成员变量char c[10]前4个字节赋值,正好对应int的4个字节,

    以16进制形式打印u1.number可以得到44434241,说明union的存取是这个样子的:

      4-1> 创建出联合体实例u1后,u1的内存如下

      4-2> 赋值u1.c[0] = 'A'; 成员变量char c[10]拥有10个字节长度,c[0]从低地址开始找到第1个字节即byte0, 赋值u1.c[0]后,内存变为:

      4-3> 赋值u1.c[1] = 'B'; 从低地址开始找到第2个字节即byte1, 赋值u1.c[1]后,内存变为:

      4-4> 赋值u1.c[2] = 'C'; 从低地址开始找到第3个字节即byte2, 赋值u1.c[2]后,内存变为:

      4-5> 赋值u1.c[3] = 'D'; 从低地址开始找到第4个字节即byte3, 赋值u1.c[3]后,内存变为:

      4-6> 读取u1.number, int类型4个字节,从低地址依次读取4个字节byte0 byte1 byte2 byte3,

    将这4个字节按照从高地址到低地址排列组合为byte3 byte2 byte1 byte0

    即 获取内存中字节时从低地址开始,将获取的字节从高地址到低地址排序,得到的值才是变量的值

  • 相关阅读:
    三层架构(我了解并详细分析)
    define a class for a linked list and write a method to delete the nth node.
    无阻塞情况connect生产EINPROGRESS错
    辛星和你解读PHP递归
    Android -- Looper.prepare()和Looper.loop() —深度版
    Canvas翻转方法
    BP神经网络的基本原理
    muduo网络图书馆评测
    HBASE
    MySQL
  • 原文地址:https://www.cnblogs.com/xieyajie/p/8086861.html
Copyright © 2020-2023  润新知