精华内容
下载资源
问答
  • 计算机科学类专升本复习之“C语言共用体”详解(初稿)
    2022-02-05 19:14:08

    C语言共用体(C语言union用法)详解

    通过之前给大家介绍,我们知道结构体"Struct"是一种"构造类型"或"复杂类型",它可以包含多个"类型不同"的成员

    在C语言中,还有另外一种和 结构体 非常类似的语法 它叫做"共用体"。

    定义形式为:

    union 共用体名{

        成员列表

    };

    共用体 有时候 也被称为"联合"或"联合体",这是Union这个单词的本意,只要英语还行的小伙伴们应该都清楚!

    注意注意注意!!! C语言两大 构造类型的区别( 结构体 与 共用体 的区别)

    1. "结构体"的"各个"成员会占用"不同的内存",互相之间没有影响

    2. "共用体"的所有成员占用"同一段内存",修改一个成员就会影响到其余成员。


     

    "结构体"占用的 内存 "大于等于" "共用体所有成员"占用的 内存 的"总和"(成员之间可能会存在缝隙)

    "共用体"

    更多相关内容
  • 本文主要介绍C语言 共用体,这里整理了相关资料及示例代码,帮助大家学习理解此部分的知识,有兴趣的小伙伴可以参考下
  • 下面小编就为大家带来一篇浅谈C语言共用体和与结构体的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 解读C语言共用体

    2021-05-18 12:44:46
    其实在C语言中还有另外一种和结构体非常类似的语法--共用体(Union),那么到底它是什么意思呢?它的作用又是什么呢?下面课课家笔者就为大家简单介绍C语言中的共用体概念和作用。所谓共用体,它表示的是几个变量共用...

    在之前的讲解中相信大家都了解到了结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。其实在C语言中还有另外一种和结构体非常类似的语法--共用体(Union),那么到底它是什么意思呢?它的作用又是什么呢?下面课课家笔者就为大家简单介绍C语言中的共用体概念和作用。

    所谓共用体,它表示的是几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在共用体中,所有的成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时,编译程序自动地产生一个变量,其长度(以字节byte为单位,一个byte是8个二进制位)为联合中最长的数据类型长度的整数倍。共用体的定义格式为:

    union共用体名{

    成员列表

    };

    另外共用体有时也被称为联合或者联合体,这也是Union这个单词的本意。

    ◎结构体和共用体的区别

    结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。共用体也是一种自定义类型,可以通过它来创建变量,比如:

    uniondata{

    intn;

    charch;

    doublef;

    };

    uniondataa,b,c;

    在上述的代码例子中我们是先定义共用体再创建变量,其实我们也可以在定义共用体的同时创建变量,具体代码如下:

    uniondata{

    intn;

    charch;

    doublef;

    }a,b,c;

    当然如果我们不再定义新的变量,我们也可以将共用体的名字省略,具体代码如下:

    uniondata{

    intn;

    charch;

    doublef;

    }a,b,c;

    在共用体data中,我们可以观察到成员f占用的内存最多,为8个字节,所以data类型的变量(也就是a、b、c)也占用8个字节的内存,具体大家可以观察下面的代码例子:

    #include

    uniondata{

    intn;

    charch;

    shortm;

    };

    intmain(){

    uniondataa;

    printf("%d,%d\\n",sizeof(a),sizeof(uniondata));

    a.n=0x40;

    printf("%X,%c,%hX\\n",a.n,a.ch,a.m);

    a.ch='9';

    printf("%X,%c,%hX\\n",a.n,a.ch,a.m);

    a.m=0x2059;

    printf("%X,%c,%hX\\n",a.n,a.ch,a.m);

    a.n=0x3E25AD54;

    printf("%X,%c,%hX\\n",a.n,a.ch,a.m);

    return0;

    }

    输出结果:

    4,4

    40,@,40

    39,9,39

    2059,Y,2059

    3E25AD54,T,AD54

    上述这段代码不仅验证了共用体的长度,而且还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。我们要想理解上面的输出结果并弄清成员之间究竟是如何相互影响的,那么我们就得了解各个成员在内存中的分布。下面笔者以上面的data为例,各个成员在内存中的分布如下:

    50cc2c14ce63ef83f1a1d0376a85fdb5.png

    成员n、ch、m在内存中“对齐”到一头,对ch赋值修改的是前一个字节,对m赋值修改的是前两个字节,对n赋值修改的是全部字节。也就是说,ch、m会影响到n的一部分数据,而n会影响到ch、m的全部数据。

    上图是在大多数PC机上的内存分布情况,如果是51单片机,情况就会有所不同(具体原因在于和机器的存储模式有关):

    2a195a734eeb10e6ff77c6cb19d6365e.png

    ◎共用体的应用

    通常共用体在一般的编程中应用较少,在单片机中应用较多。为了使大家更容易的了解共用体的应用,下面笔者通过PC机给大家举一个具体表格例子:

    题目:下面是一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。

    目标:把信息放在同一个表格中并设计程序输入人员信息然后输出。

    9acad2e5f34d6f78a61aa4818d519c36.png

    分析:在这里f和m分别表示女性和男性,s表示学生,t表示教师。从表格中我们可以看出,学生和教师所包含的数据是不同的。如果我们把每个人的信息都看作一个结构体变量的话,那么教师和学生的前4个成员变量是一样的,第5个成员变量可能是score或者course。当第4个成员变量的值是s的时候,第5个成员变量就是score;当第4个成员变量的值是t的时候,第5个成员变量就是course。

    经过上面的简单分析,接下来我们就可以设计一个包含共用体的结构体了,具体大家可以观察下面的代码:

    #include

    #include

    #defiNETOTAL4//人员总数

    struct{

    charname[20];

    intnum;

    charsex;

    charprofession;

    union{

    floatscore;

    charcourse[20];

    }sc;

    }bodys[TOTAL];

    intmain(){

    inti;

    //输入人员信息

    for(i=0;i

    printf("Inputinfo:");

    scanf("%s%d%c%c",bodys[i].name,&(bodys[i].num),&(bodys[i].sex),&(bodys[i].profession));

    if(bodys[i].profession=='s'){//如果是学生

    scanf("%f",&bodys[i].sc.score);

    }else{//如果是老师

    scanf("%s",bodys[i].sc.course);

    }

    fflush(stdin);

    }

    //输出人员信息

    printf("\\nName\\t\\tNum\\tSex\\tProfession\\tScore/Course\\n");

    for(i=0;i

    if(bodys[i].profession=='s'){//如果是学生

    printf("%s\\t%d\\t%c\\t%c\\t\\t%f\\n",bodys[i].name,bodys[i].num,bodys[i].sex,bodys[i].profession,bodys[i].sc.score);

    }else{//如果是老师

    printf("%s\\t%d\\t%c\\t%c\\t\\t%s\\n",bodys[i].name,bodys[i].num,bodys[i].sex,bodys[i].profession,bodys[i].sc.course);

    }

    }

    return0;

    }

    输出结果:

    Inputinfo:HanXiaoXiao501fs89.5↙

    Inputinfo:YanWeiMin1011mtmath↙

    Inputinfo:LiuZhenTao109ftEnglish↙

    Inputinfo:ZhaoFeiYan982ms95.0↙

    NameNumSexProfessionScore/Course

    HanXiaoXiao501fs89.500000

    YanWeiMin1011mtmath

    LiuZhenTao109ftEnglish

    ZhaoFeiYan982ms95.000000

    本次解读C语言共用体的讲解到此暂告一段落,如果以后有什么内容继续补充或者修改的话笔者会继续在此进行补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习C语言能够起到一定的帮助作用!

    展开全文
  • C语言共用体

    2019-03-15 00:01:31
    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。 union 共用体和...

    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
    union 共用体和结构体的区别在于:结构体定义了一个由多个数据成员组成的特殊类型,而公用体定义了一块为所有数据成员共享的内存。
    共用体也称为联合体,它使几种不同类型的变量存放到同一段内存单元中。所以共用体在同一时刻只能有一个值,它属于某一个数据成员。由于所有成员位于同一块内存,因此共用体的大小就等于最大成员大小。

    1 定义共用体

    为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

    union [union tag]{
       member definition;
       member definition;
       ...
       member definition;
    } [one or more union variables];
    

    union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:

    union Data{
       int i;
       float f;
       char  str[20];
    } data;
    

    现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。

    共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:

    #include <stdio.h>
    #include <string.h>
     
    union Data{
       int i;
       float f;
       char  str[20];
    };
     
    int main( ){
       union Data data;        
     
       printf( "Memory size occupied by data : %d\n", sizeof(data));
     
       return 0;
    }
    

    2 访问共用体成员

    为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。您可以使用 union 关键字来定义共用体类型的变量。下面的实例演示了共用体的用法:

    #include <stdio.h>
    #include <string.h>
     
    union Data{
       int i;
       float f;
       char  str[20];
    };
     
    int main( ){
       union Data data;        
     
       data.i = 10;
       data.f = 220.5;
       strcpy( data.str, "C Programming");
     
       printf( "data.i : %d\n", data.i);
       printf( "data.f : %f\n", data.f);
       printf( "data.str : %s\n", data.str);
     
       return 0;
    }
    
    展开全文
  • c语言共用体实例使用

    2021-03-03 16:05:50
    一、共用体介绍 二、定义 union [union tag] { member definition; member definition; … member definition; } [one or more union variables]; 1、 union Data { int i; float f; char str[20]; } data; 三、访问...

    一、共用体介绍
    共用体,结构和结构体类似,在内存上面共享一个内存,内存大小为最大的成员内存
    例如:

    union Data
    {
       int i;
       float f;
       char  str[20];
    } data;
    3个成员,最大的成员为str数组,20字节,那么共用体占用内存为20字节,i对应位byte0-3,f对应byte0-3,str对应byte0-19
    

    二、定义

    union [union tag]
    {
       member definition;
       member definition;
       ...
       member definition;
    } [one or more union variables];
    
    1、方式1
    union Data
    {
       int i;
       float f;
       char  str[20];
    } data;
    
    2、方式2
    union Data
    {
       int i;
       float f;
       char  str[20];
    } ;
    union Data data;
    
    3、方式3
    typedef union 
    {
       int i;
       float f;
       char  str[20];
    } data_def;
    data_def data;
    

    三、访问

    data.i = 10;
    printf("%d",data.i);
    

    四、实例
    需求:can总线通信,一帧最大收发数据8个字节,每帧都要帧id,收到数据存入id,buff[8]
    现在需要
    1、缓存不同帧对应的数据
    2、解析帧数据,帧数据协议如下
    id 0 byte0 value1 byte1-2 value2 byte3 value3 byte4-7 value4
    id 1 byte0-3 value5 byte4-7 value6

    常规操作

    char id0buff[8],id1buff[8];
    char value1,value3,
    short value2;
    int value4,value5,value6;
    
    if(id == 0)
    {
    	memcpy(id0buff, buff, 8);
    	value1 = id0buff[0];
    	value2 = id0buff[1] *256 + id0buff[2];
    	value3 = id0buff[3];
    	value4 = (id0buff[4] << 24) + (id0buff[5] << 16) + (id0buff[6] << 8) +id0buff[7];
    	printf("%d %d %d %d ",value1, value2, value3, value4);
    }
    if(id == 1)
    {
    	memcpy(id1buff, buff, 8);
    	value5 = (id0buff[0] << 24) + (id0buff[1] << 16) + (id0buff[2] << 8) +id0buff[3];
    	value6 = (id0buff[4] << 24) + (id0buff[5] << 16) + (id0buff[6] << 8) +id0buff[7];
    	printf("%d %d  ",value5, value6);
    }
    

    结构体+指针操作

    typedef struct 
    {
       char value1;
       short value2;
       char value3;
       int value4;
    } id0_def;
    
    typedef struct 
    {
    	int value5;
       int value6;
    } id1_def;
    id0_def id0data,*p_id0;
    id1_def id1data,*p_id1;
    
    if(id == 0)
    {
    	p_id0 = (p_id0 *)buff;
    	id0data = (*p_id0);
    	printf("%d %d %d %d ",id0data.value1, id0data.value2, id0data.value3, id0data.value4);
    }
    if(id ==1)
    {
    	p_id1 = (p_id1 *)buff;
    	id1data = (*p_id1);
    	printf("%d %d ", id1data.value5, id1data.value6);
    }
    

    共用体+结构体操作

    typedef struct 
    {
       char value1;
       short value2;
       char value3;
       int value4;
    } id0_def;
    typedef union 
    {
       unsigned char buff[8];
       id0_def data;
    } id0_buff_def;
    
    typedef struct 
    {
    	int value5;
       int value6;
    } id1_def;
    typedef union 
    {
       unsigned char buff[8];
       id1_def data;
    } id1_buff_def;
    
    id0_buff_def id0buff;
    id1_buff_def id1buff;
    
    if(id == 0)
    {
    	memcpy(id0buff.buff, buff, 8);
    	printf("%d %d %d %d ",id0buff.data.value1, id0buff.data.value2, id0buff.data.value3, id0buff.data.value4);
    }
    if(id == 1)
    {
    	memcpy(id1buff.buff, buff, 8);
    	printf("%d %d ", id1buff.data.value5, id1buff.data.value6);
    }
    
    展开全文
  • C语言共用体的作用

    2021-05-18 12:43:01
    一、介绍1、共用体(Union),它的定义格式为:union 共用体名{成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。2、结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相...
  • C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{ 成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的...
  • 我好像已经缓不过来了,我开始...一、共用体使用 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> union Aiyou { int a; char b; double c; }; ...
  • C语言共用体(Union)

    2021-02-25 19:10:16
    C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:union 共用体名{成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别在于:...
  • 以前在学习c语言的时候,有接触过共用体。 彼时对共用体Union的理解无非就是: union { int a; int b; char c; } 对union内的任意成员赋值都会覆盖掉其他成员,当时觉得很好理解,觉得懂了。 但是对于共用...
  • 运行以下代码,看一看输出的结果是什么? #include <stdio.h> int main(){ ...共用体的特点为:共用体可以将不同数据类型的值放在同一个内存空间中,现实在一个存储区根据程序执行的不同需求
  • 一、公用 1、什么是公用 定义:所有成员都使用同一片地址单元 2、如何来定义公用 格式: union 公用类型名称{ 成员链表 }; 说明: 1)公用的定义与使用方法与结构体类似 2)结构体当中的各个成员都有...
  • c++中,结构体(struct)和共用体(union)是比较相似的复合数据类型,这两个都是用来存储多种数据的,但是他们之间还是有很大差距的,一起来了解【1】共用体(1)共用体的概念在 C 语言中,不同数据类型的数据可以使用...
  • C语言共用体union

    2021-05-11 21:49:50
    10.共用体union 10.1、共用体类型的定义、变量定义和使用 (1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。 (2)共用体和结构体的不同:结构体类 似于一个包裹,结构体中的成员彼此是独立存在...
  • ![图片说明](https://img-ask.csdn.net/upload/202006/16/1592312673_776627.jpg) 有大佬能解释一下第一第二空嘛那一大串数字是怎么来的(我已经知道共用体对不同成员赋值会覆盖掉d)
  • C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{ 成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的...
  • C语言共用体类型(union)

    千次阅读 2017-06-20 22:33:06
    共用体类型的定义:用同一段内存单元存放不同类型的指针变量。 使用类似覆盖技术,后一个数据覆盖了前面的数据,使几个不同的变量共享同一段同一段内存的结构。 定义共用体类型变量的一般形式为: union ...
  • c语言 共用体

    2022-03-03 10:18:43
    c语言 共用体1、共用体的概念2、共用体类型的定义共用体的应用访问共用体成员 1、共用体的概念 在编程过程中,有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可以把一个整型变量,一个字符型变量,一...
  • C语言共用体详解

    2021-12-05 22:01:22
    文章目录 (一)共用体 ( 二)共用体的作用 (三)共用体的应用 (1)IP地址是unsigned int 类型,请将其转成点分十进制输出 (2)将字符串的ip地址转成unsigned int类型 (一)共用体 ( 二)共用体的作用 (1)...
  • 遇到有关共用体字节数的题目,于是我用写了一小段代码输出共用体的字节数,但发现了一点问题: #include #include #include int main(){ union aa{ int x,y; char c[6]; }a; printf("%d", sizeof(a)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,485
精华内容 7,794
关键字:

c语言共用体

友情链接: 实验.zip