精华内容
下载资源
问答
  • 联合体和结构体

    2017-02-10 19:55:03
    联合体和结构体 1. 结构联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。  2. ...
    联合体和结构体
    1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 
    2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

    --------------------------------------------------------------------------------------------------------
    union
    {
    int i;
    char x[2];
    }a;

    void main()
    {
    a.x[0] = 10;
    a.x[1] = 1;
    printf("%d",a.i);
    }
    答: 266 (低位低地址,高位高地址,内存占用情况是Ox010A) 


    --------------------------------------------------------------------------------------------------------

    int main(int argc, const char * argv[])
    {
    union{ /*定义一个联合*/
    int i;
    struct{ /*在联合中定义一个结构*/
    char first;
    char second;
    }half;
    }number;
    number.i=0x4241; /*联合成员赋值*/
    printf("%c%c\n", number.half.first, number.half.second);
    number.half.first='a'; /*联合中结构成员赋值*/
    number.half.second='b';
    printf("%x\n", number.i);
    return 0;
    }

    答:
    AB (0x41对应'A',是低位;Ox42对应'B',是高位)
    6261 (number.i和number.half共用一块地址空间)
    --------------------------------------------------------------------------------------------------------
    展开全文
  • 联合体和结构体的区别
  • 联合体和结构体对齐

    2019-05-07 00:01:40
    1、联合体同一时间只能存储1个被选择的变量,对其他...3、联合体和结构体大小要是所有成员变量类型大小的整数倍 实例1: typedef union u { char a; int b[5]; double c; int d[3]; }U; typedef struct s { ...

    字节对齐主要是为了提高内存的访问效率,比如intel 32为cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。

    内存对齐主要遵循下面三个原则:
    结构体变量的起始地址能够被其最宽的成员大小整除
    结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
    结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

    1、联合体同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量
    2、联合体大小要至少能容纳最大的成员变量
    3、联合体和结构体大小要是所有成员变量类型大小的整数倍

    实例1

    #include <iostream>
    
    typedef union UNI
    {
        char data1;
        unsigned short data2;
        double data3;
        char data4[30];   // 成员最大的占地址空间为30,但是需要满足double的8字节对齐,故需要补2个空位,为32字节大小。
        int data5; 
    }MYUNI;         
    
    typedef struct STU
    {
        char data1;           // 1
        unsigned short data2;    // (1 + 1) + 2,1字节不满足unsighed short对齐,补1个空位。
        double data3;             // ((1 + 1) + 2 + 4) + 8,(1 + 1) + 2 = 4字节不满足double对齐,补4个空位。
        MYUNI uni;        //  ((1 + 1) + 2 + 4) + 8 + 32
        char data4[3];    // 48 +3,  48字节满足字节对齐,直接加3。(如果后面已经没有数据了,则需要满足最终的8字节对齐,补5个空位。)
        int data5;       // 51 + 4,最终需要满足double的8字节对齐,需要补空位1个成56.
    }MYSTU;
    
    int main()
    {
        std::cout << sizeof(double) << std::endl;
        std::cout << "MYUNI:" << sizeof(MYUNI) << " MYSTU:" <<sizeof(MYSTU) << std::endl;
    
        while(1);
    
        return 0;
    }
    
    
    

    实例2:

    typedef union u
    {  
        char a;
        int b[5];
        double c;
        int d[3];     
    }U;  
    typedef struct s    
    {     
        int  e;    
        double f;       
        short g;            
        U h;          
        char i[2]; 
    }S;   
    

    U大小至少要容纳最大的b[5]=4*5=20字节,同时要是变量类型最大值得整数倍,即sizeof(double)=8的整数倍,所有sizeof(U)=24
    s的大小计算需要看上一篇关于结构体大小的计算的文章sizeof计算结构体大小,联合体的自身对齐值为成员变量的最大对齐值,也就double的自身对齐值8,所以s得大小为4+4(对齐满足8的倍数)+8+2+6(对齐满足8的倍数)+24+2+6(对齐满足8的倍数)=56

    实例3

    typedef union UNI
    {
        int data;
        int data2[5];
        double data3;
    }nu;    // 24
    
    typedef struct STU
    {
        int data;
        nu num;
        double data3;
    }stu1;
    
    std::cout << sizeof(stu1) << std::endl;   // 4 + 4(对齐double8长度的补充) + 24(如果不是8的倍数则需要增加长度满足) + 8
    
    展开全文
  • 由于共用体的特点是共用体内的成员共用存储空间,那么遇到一个结构中成员互斥时,可以采用共用体,大家互斥的存在,那么每一次只会有一个成员用这个内存空间,不会存在彼此之间数据覆盖,又节约了内存空间。...
  • 联合体和结构体辨析

    2020-08-21 17:19:41
    1、结构体 typedef 是为结构体变量起别名 计算结构体的字节大小需要满足三个要求 a、默认从0地址开始计算 b、能整除自己类型的大小 c、最后大小能整除最大基本类型 ...3、结构体联合体 4、打印结构体 ...

    1、结构体
    在这里插入图片描述

    typedef 是为结构体变量起别名
    在这里插入图片描述
    计算结构体的字节大小需要满足三个要求
    a、默认从0地址开始计算
    b、能整除自己类型的大小
    c、最后大小能整除最大基本类型

    在这里插入图片描述
    在这里插入图片描述
    注意:结构体中可以嵌套结构体指针,不能嵌套结构体变量
    原因:指针可以算出大小,但是变量的大小不能确定,编译器在编译时会报错。
    在这里插入图片描述
    在这里插入图片描述

    结构体的初始化
    对于定义的姓名指针只能指向,不能改值;数组定义的姓名,可以修改值。

    在这里插入图片描述

    2、联合体
    定义格式:
    union 联合体名{

    };
    在这里插入图片描述

    可以用联合体类型来测试大小端。
    大端模式:指数据的高字节保存在低地址中,而数据的低字节保存在高地址中,类似于数据当做字符串顺序处理
    小端模式:指数据的高字节放在高地址中,而数据的低字节放在低地址中
    在这里插入图片描述

    3、结构体与联合体
    区别:结构体的各个成员占用不同的内存,互相之间没有影响;联合体所有成员占用同一段内存,修改一个成员会影响其他所有成员。
    结构体占用的内存大于等于所成员的内存总和(成员之间存在间隙),联合体的内存等于最长的成员占用的内存,同一时刻只能保持一个成员的值,如果对新成员赋值会覆盖掉原来成员的值。

    在这里插入图片描述
    在这里插入图片描述
    4、打印结构体
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • C语言利用联合体和结构体位域实现位带操作代码 C语言编程时经常需要操作特定的数据中特定的bit位,可以通过与、或操作实现。我试了一下用结构体位域和联合体,实现了可单独对bit操作。正常变量赋值一样,即可对...

    C语言利用联合体和结构体位域实现位带操作


    C语言编程时经常需要操作特定的数据中特定的bit位,可以通过与、或操作实现。我试了一下用结构体位域和联合体,实现了可单独对bit操作。和正常变量赋值一样,即可对单独的bit位写1或写0。下面是代码和运行结果。
    小白的第一篇博客,工作时遇到的问题用博客记录一下,方便以后查看。希望能坚持下去。

    #include "stdio.h"
    
    typedef struct 
    {
       unsigned int b1:1;
       unsigned int b2:1;
       unsigned int b3:1;
       unsigned int b4:1;
       unsigned int b5:1;
       unsigned int b6:1;
       unsigned int b7:1;
       unsigned int b8:1;
    } _bit;
    
    union bit_test
    {
        char byte;
        _bit bit;
    }test_a;
    
    
    int main(void)
    {
        test_a.byte = 0x55;
        printf("b1=%d,b2=%d,b3=%d,b4=%d\n",test_a.bit.b1,test_a.bit.b2,test_a.bit.b3,test_a.bit.b4);
        test_a.bit.b2 = 1;
        test_a.bit.b7 = 0;
        printf("test_a=%d\n",test_a.byte);
        return 0;
    }
    
    展开全文
  • 联合体结构体是很容易混淆的概念。粗略一看,两者无论声明、定义还是定义对象的方式都很相似。然而这两个东西的概念作用实际千差万别。首先,联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的...
  • 2. 结构体大小(各元素大小之)或联合体大小(最大元素的大小)被结构体对齐字节数(复合体元素要拆开来辨识结构体对齐字节数)整除 结构体对齐字节数 = Min(8,max(结构体各元素大小));   重要:默认8字节,...
  • 区别: 结构体是多个不同类型变量的组合,其占用的内存大小是...联合体是多个不同类型变量的组合,其占用内存的大小是联合体中最大的那个变量的大小; 转载于:https://www.cnblogs.com/dingou/p/11229112.html...
  • 结构体 结构体:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。...结构体的变量的定义初始化 struct Point { int x; int y; }p1; struct Point p2; struct Poi
  • 联合体转载自这里  当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:      1)联合体是一个结构;...
  • union – 联合体,它的成员共享同一内存,内存分配时,考虑占内存最多的那个成员。 struct – 结构体,它的每个成员都有自己的内存空间,但空间在同一区域块,分配时还考虑4字节对齐(即不满4的倍数时,凑满到4的...
  • C语言中的联合体和结构体

    千次阅读 2013-12-30 20:26:56
    先说结构体 结构体的定义很简单,注意这里并不分配空间//这里只是定义一个简单的结构体类型,并不为其分配内存空间 struct student { int num; char name[20];...下面打印一下struct内部变量的大小
  • 总的来说就是结构体内有共用体成员,共用体内有结构体成员,这个结构体内的成员就是allbit。   volatile是一个类型 修饰符 (type specifier). volatile 的作用是作为指令 关键字 ,确保本条指令不会因 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,519
精华内容 6,207
关键字:

联合体和结构体