首页 > 其他分享 >共用体详解

共用体详解

时间:2023-08-29 10:04:26浏览次数:42  
标签:变量 union float 详解 内存 printf 共用


共用体同结构体的定义形式上相同,只是把关键字struct改为union。

有时需要把几种不同类型的变量放在同有一内存区域中,见图12-6,把一个整型变量,一个字符变量,一个实型变量放在同一内存区域中,尽管三个变量占用字节数各不相同,但起始地址都一样(例如1000)它要用“覆盖’’技术,使多个变量互相覆盖。这种结构称为共同体或者联合。

 

定义共用体方式类似结构体。

例如:

union data                           或union                               或union data
{  int i;                                 { int i;                               {int  i;   
char ch;                            char ch                              char ch
float f;                              float f;                            float f;
}a,b,c;                         }a,b,c;                       };
union data a,b,c;

“共用体”和“结构体”定义形式相似,但其含义不同。结构体变量所占内存长度是各成员的内存之和(如图13-6为七个字节),但共用体变量所占内存长度是最长成员的长度(如图13-6中为4个字节)。

 

12.6.2引用方式

 

先定义共用体变量后才可以引用它。不能引用共用体变量本身。而只能引用其中的成员。例如:printf(″%d″,a);是错误的,printf(″%d″,a.i);是正确的。

例12-10

main()
{ union tdate
{ int uint;
long tlong;
float tfloat;
doudle tdouble;
char  *tstring:
}t;
t.uint=3;printf(″%d\n″,t.uint);
t.tlong=300;printf(″%1d\n″,t.tlong);
t.tfloat=3.0;printf(″%f\n″,t.tfloat);
t.tdouble=3.00;printf(″%f\n″,t.tdouble);
t.tstring=″stu″;printf(″%s\n″,t.tstring);
}

12.6.3共用体的特点

 

(1)同一内存段可放几种不同类型的成员,但每一瞬间只能存放一种。例如:

a.i=1;
a.c=′a′;
a.f=2.1;

在完成以上三个运算后,只有a.f是有效的,a.i及a.c都不再有效,因此用printf(″%f″,a.f);是可以的。但不能用printf(″%c″,a.c);,所以引用共同体变量时应该特别注意当前放的是什么数据。

(2)共用体变量地址及其各成员地址都是同一地址。即&a,&a.i,&a.c,&a.f值相同。

(3)不能对共用体变量名赋值。也不能定义时进行初始化。

(4)不能把共用体变量作为函数参数,也不能使函数返回共同体变量,但可以使用指向共用体的指针。

(5)允许定义共用体数组。

标签:变量,union,float,详解,内存,printf,共用
From: https://blog.51cto.com/u_13566975/7272493

相关文章

  • cron表达式详解
    Cron表达式是一种用于指定定时任务执行时间的字符串表达式。它由6个或7个字段组成,每个字段代表一个时间单位或一个时间段。下面是对Cron表达式的详细解释:秒(可选):0-59之间的整数,表示每分钟的哪一秒执行任务。例如,0表示每分钟的第0秒执行任务。分钟:0-59之间的整数,表示每小时的......
  • 19.Linux中write函数详解
    19.Linux中write函数详解头文件:#include<unistd.h>函数原型:write(intfd,constvoid*buf,size_tcount);函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。返回值:如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错......
  • ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解
    目录一、什么是ImportBeanDefinitionRegistrar二、ImportBeanDefinitionRegistrar使用很简单registerFilters()方法三、ImportBeanDefinitionRegistrar原理一、什么是ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar接口是也是spring的扩展点之一,ImportBeanDefinition......
  • iOS IPA包的制作和上传步骤详解​
     目录 前言一、IPA包的原理二、IPA包上传的步骤1.注册开发者账号2.创建应用程序3.编码和设计4.生成证书和配置文件5.打包IPA包6.上传IPA包三、总结 前言iOSIPA包是iOS应用程序的安装包,可以通过iTunes或其他第三方应用商店安装到iOS设备上。在进行iOS应用程序......
  • go 语言中的占位符详解
    在Go语言的fmt包中,占位符用于格式化输出,允许在输出时插入变量的值。以下是一些常用的占位符及其用法:通用占位符:%v:按照值的默认格式输出。%+v:输出结构体时,会添加字段名。%#v:输出Go语法表示的值。%T:输出变量的类型。%%:输出百分号。布尔值占位符:%t:格式化布尔值......
  • .NET Core使用NPOI导出复杂Word详解
    前言:最近使用NPOI做了个导出Word文档的功能,关于使用.NETCore导出Word文档的方式有很多。最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第三方框架(并且现在已支持.NETCore,GitHub源码地址:https://github.com/tonyqus/npoi)。因为之前使用NP......
  • pytorch nn.LSTM模块参数详解
    nn.LSTM模块参数input_size:输入的维度hidden_size:h的维度num_layers:堆叠LSTM的层数,默认值为1bias:偏置,默认值:Truebatch_first:如果是True,则input为(batch,seq,input_size)。默认值为:False(seq_len,batch,input_size)bidirectional:是否双向传播,默认值为False 输入(in......
  • JVM调优实战及常量池详解
    阿里巴巴Arthas详解 Arthas 是 Alibaba 在2018年9月开源的 Java诊断工具。支持 JDK6+,采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas  Arthas使用场景得益于Arthas强大且丰富的功......
  • Maven配置详解
    <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">......
  • 语言类型详解
    1、编译型语言需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。优点:编译器一般会有预编译的过程对代码进行优化。因为编译只......