首页 > 其他分享 >10. 共用体

10. 共用体

时间:2023-03-03 17:44:06浏览次数:57  
标签:10 定义 成员 数据类型 共用 变量名 变量

一、什么是共用体

  共用体也称为联合体,它使几种不同类型的变量存放到同一段内存单元中。所以共用体在同一时刻只能有一个值,它属于某一个数据成员。由于所有成员都位于同一块内存,因此共同体的大小就等于最大成员的大小。

  结构体与共用体之间的区别在于:结构体的各个成员会占用不同的人内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员值会影响其余所有成员。

二、共用体的声明

  定义共用体变量的一般形式如下:

union 共用体名
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
};

  其中,uinon 关键字表示声明共用体,其后的共用体名表示该公用体的类型名,大括号中的变量构成共用体的成员,也就是一般形式的成员列表;

在声明结构体时,要注意括号最后面有一个分号“;”

三、共用体变量的定义

  声明一个共用体体表示的是创建一种新的类型名,需要用新的类型名在定义一个变量。定义的方式有 3 种:

【1】、声明公用体类型,再定义变量

union 共用体类型名 结构体变量;

【2】、在声明结构体时定义变量

union 共用体名
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
}变量名1,变量名2,...,变量名n;

定义的变量不是只能有一个,可以定义多个变量;

【3】、直接定义结构体类型变量

  如果我们只需要确定个数的共用体变量,后面不需要再使用共用体数据类型定义变量,我们可以在定义时不给出共用体名。

union
{
    数据类型 成员1;
    数据类型 成员2;
    ...
    数据类型 成员n;
}变量名1,变量名2,...,变量名n;

四、共用体变量的引用

  定义共用体之后,就可以引用其中的成员数据进行使用。引用的一般形式为:

共用体变量.成员名

不能直接引用共用体变量;

五、共用体变量的初始化

  在定义共同体变量时,可以同时对共用体变量进行初始化操作。初始化的值放在一对大括号中。对共同体变量进行初始化时,只需要一个初始化值就足够了,其类型需要和共用体的第一个成员的类型一致。如果共用体的第一个成员是一个结构体类型,则初始化值可以包含多个用于初始化该结构体的表达式。

#include <stdio.h>

union data
{
    int n;
    char ch;
    short s;
};

int main()
{
    union data a = {100};

    printf("%d %d\n",sizeof(a),sizeof(int));
    printf("%d %c %d\n",a.n,a.ch,a.s);
    a.ch = 'a';
    printf("%d %c %d\n",a.n,a.ch,a.s);
    a.s = 50;
    printf("%d %c %d\n",a.n,a.ch,a.s);

    return 0;
}

六、共用体类型的数据特点

  1. 同一个内存段可以用来存放几种不同类型的成员,但是每一次只能存放其中一种,而不是同时存放所有的类型。也就是说,在共用体种,只有一个成员起作用,其它成员不起作用。
  2. 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
  3. 共用体变量的地址和它的各成员的地址是一样的。
  4. 共用体变量不能作函数参数,也不能作函数的返回值。
  5. 不能对共用体变量名赋值,也不能引用变量名来得到一个值。

标签:10,定义,成员,数据类型,共用,变量名,变量
From: https://www.cnblogs.com/kurome/p/17176469.html

相关文章

  • pat乙级 1021个位数统计
    #include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#definek1000intmain(){inti=0;charnum[k];for(i=0;i<k......
  • 项目启动后每10秒执行一次定时任务
    转自:https://blog.csdn.net/qianlixiaomage/article/details/106599951Springboot开启定时任务的三种方式springboot进行定时任务一共有三种方式,第一种也就是最简单的一......
  • vue项目报错:error:0308010C:digital envelope routines::unsupported
    原因:下载了一个vue项目,npmi下载依赖完事后,npmrundev就起不来了,百思不得其解。后来发现因为node版本问题。注:搜索网上说一句代码命令就好使了(命令终端运行以下代码e......
  • Windows 10 域环境下黑屏问题处理
    1.打开注册表,定位到HKEY_CURRENT_USER\ControlPanel\Desktop,找到WallPaper,将其值设置为共享图片的UNC路径。2.再将C盘用户账号文件夹AppData\Roaming\Microsoft\Wind......
  • 宏定义与共用体
    宏定义要注意的问题:1、宏定义一般是在函数的外面2、宏定义必须要先定义,再使用宏。如果先使用就会编译报错。3、宏定义中宏名一般用大写。不是语法规定的,是一般约定俗成......
  • Thunderbird 102修改文字编码
    日期:2023.3.3Thunderbird版本:102.8.0(本文可靠性待验证)最近有同事收我邮件附件显示乱码,基本上确定是文字编码问题,但是Windows新版Thunderbird好像没有修改的地方:进入设置,找到......
  • 银河麒麟V10——Postgres-12.5主从编译安装
    一、机器信息IP/主机名备注192.168.50.1/Rz01.local 主库192.168.50.2/Rz02.local 从库 二、编译包下载链接:https://pan.baidu.com/s/1fiOmYB8uplfA1LQDy_LhqQ提取......
  • mysql: 看不见的空符号 char(9) char(10) char(13)
    trim,消除前后的空格,没有效时果updatetable_namesetcolumn_name=replace(replace(replace(column_name,char(9),''),char(10),''),char(13),'');说明:table_name:表......
  • $10 ^ 9 + 9$ 和 $10 ^ {18} + 9$ 是质数。
    ......
  • Microsoft Visual Studio 2010 Service Pack 1官方下载版(ISO)
    1.用迅雷下载很快,总大小1.48G,安装过程中所需的所有msi程序包都在文件内。2.安装过程中,如果提示“无法访问你试图使用的功能所在的网络位置”,所需的所有msi文件都在这个1......