联合体(union)以及数据的存储

结构体(或者联合体)变量的成员在内存里是如何分布的 一、 结构体变量的成员在内存里是如何分布的、成员先后顺序是怎样的、成员之间是连续的还是分散的、还是其他的什么形式?这些问题既和软件相关又和硬件相关。所谓软件相关主要是指和具体的编程语言的编译器的特性相关,编译器为了优化CPU访问内存的效率,在生成结构体成员的起始地址时遵循着某种特定的规则,这就是所谓的 结构体成员“对齐”;所谓硬件相关主要是指CPU的“字节序”问题,也就是大于一个字节类型的数据如 阅读详情

联合体(union)以及数据的存储

当多个数据需要共享内存或多个数据每次只取其一时,可以利用联合体(union),有关联合体的描述如下:
1.联合体是一个结构;
2.它的所有成员相对于基地址的偏移量都为0;
3.此结构空间要大到足够容纳最"宽"的成员;
4.其对齐方式要适合其中所有的成员。

对上面四句话的理解:
        由于联合体的所有成员是共享一段内存的,因此每个成员的存放首地址相对于联合体变量的基地址额偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。再来着重介绍一下什么叫"对其方式要适合其中所有的成员"?

例如:
#include<stdio.h>
typedef struct u
{
	char a;
	int b;
}U1;

int main()
{
	printf("%d\n",sizeof(U1));
	return 0;
}


假设U1按如下方式内存方式布局(内存地址从左至右递增):



       因为U1中有最强对齐要求的是b字段(int),所以U1对象的首地址一定是4的倍数,那么上述内存的布局中的b字段能满足int类型的对齐要求吗?显然是不能的,于是有了如下的地址分配方案:



       这个方案在a与b之间多分配了3个填充(padding)字节,这样当整个struct对象首地址满足4字节的对齐要求时,b字段也一定能满足int型的4字节对齐规定。那么sizeof(U1)显然就应该是8,而b字段相对于结构体首地址的便宜就是4。我们看一下程序给的结果吧:


那么下面这个呢?
typedef struct u2
{
      int     a;
      char  b;
}U2;

其实和上例子是一样的,sizeof(U2)也是8。


好的,现在你已经掌握了结构体内存布局的基本准则,尝试分析一个稍微复杂点的类型吧。
例如:
typedef struct u
{
	char a[9];
	int b;
	double d;
}U1;
      先来分析一下,a占9字节,b占4字节,d占8字节,这里最"宽"的变量是a,因此内存大小至少是9。像上面的例子一样,U1的地址最前面是9个字节,然后在a和b之间多分配了3个填充(padding)字节,在然后是b的4个字节,最后是d的8个字节。sizeof(U1)=24。看看程序运行的结果吧:
#include<stdio.h>
typedef struct u
{
	char a[9];
	int b;
	double d;
}U1;

int main()
{
	printf("%d\n",sizeof(U1));
	return 0;
}



下面来个有关union使用的测试程序加深理解:
#include<stdio.h>
union un
{
	int i;
	short int si[2];
	char c[4];
}u;

int main()
{
	u.c[0]='A';
	u.c[1]='B';
	u.c[2]='C';
	u.c[3]='D';
	printf("u.c[0]=%d,u.c[1]=%d,u.c[2]=%d,u.c[3]=%d\n",u.c[0],u.c[1],u.c[2],u.c[3]);
	printf("u.si[0]=%d,u.si[1]=%d\n",u.si[0],u.si[1]);
	printf("u.i=%d\n",u.i);
	return 0;
}

程序运行结果如下:


在程序中,由于联合体的特点,变量x占4个字节。我们可以从3个角度观察这4个字节:
(1)整体看,是一个int型数据;
(2)分成2部分看,是两个短整型数据;
(3)分成4部分看,是4个单字节的数据。
但无论怎么看,就是这4个字节。无论用哪种形式操作数据,使用的也就是这4个字节。联合体为我们提供了从不同的角度使用这4个字节的方式。
x.c[0]到x.c[3]的值分别为65\66\67\68,这好理解。
x,si[0]占2字节,与x.c[0]和x.c[1]相同。验证一下:16961=66*256+65(66是'B'的ASCII值,65是'A'的ASCII值,是字符的存储形式)。注意,这里体现存储数据时低位在前,高位在后,低位是65,高位时66。正如十进制数98,高位时9,低位是8,所以98=9*10+8一样。因为是高位,所以乘以权位10,表示9这个符号代表的其实是90。66*256,因为存储66('B')的那一个字节的位置,比存储65('A')的那一字节的位置高8位,所以乘以2的8次方,即256。
       概括讲,存储2字节的16961时,其低8位,是65,在前(x.c[0]),而其高8位,是66,在(x.c[1])。低位在前,高位在后。
       请自行验证:17475=68*256+67,提现低位在前,高位在后。(x.si[1]占2字节,与x.c[2]和x.c[3]相同)。
       再请验证:1145258561=17475*256*256+16961,也体现在低位在前,高位在后。(x.i占4字节,与x.si[0]和x.si[1]相同)。
       再请验证:1145258561=68*256*256*256+67*256*256+66*256+65。同样的道理。

C/C++ 联合体union多个参数赋值被覆盖问题(内存角度)详解 最近在学习C++内容,刚好学到了联合体union,在给union内变量赋值时发现了一个很有意思的现象,假如union中有两个int类型的变量,先后进行赋值,从内存中可发现第二个Int型变量的数值将第一个Int型变量数值覆盖了,接下来从内存的情况直观的观察这一现象,并提出思考。...... 阅读详情

相关推荐

【C语言】联合体-共用体 (union) 详解

C语言,联合体,共用体,union

虾米Life 4270

联合体(共用体) union 的深入理解

1.联合类型的定义: 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。//联合类型的声明 union Un { char c; int i; }; //联合变量的定义 union Un un; //计算连个变量的大小 printf("%d\n", sizeof(un)); 解析:联合体(并不一定是共用完全部,有可能是不完全共用,只共用一小部分;或是联合体中的其他元素加起来的字节数要大于最大的那个元素的字节数,会把联合体共用完.

anyway33的博客 6458

SAP SD信贷管理实战:从配置到风险控制的完整指南(附后台路径)

本文详细解析了SAP SD信贷管理的完整配置流程与风险控制策略,涵盖信贷控制范围设置、风险分级机制及动态控制配置。通过实战案例和后台路径指引,帮助企业实现从客户信用评估到实时监控的全流程管理,有效降低坏账风险并优化资金安全。

3a9bq4r8t2y的博客 212

C语言中联合体union的使用

一、前言     最近在准备考研的专业课中,遇到了C语言的联合体,在此总结一下。 二、简介     联合体union和结构体struct有一些相似之处,但两者本质上不同,在结构体中,各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中的最大长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变

颗粒归仓 1687

COLMAP在Ubuntu下的编译陷阱与实战避坑指南——从环境配置到三维重建全流程

本文详细介绍了在Ubuntu系统下编译和配置COLMAP三维重建工具的全流程,包括环境准备、依赖库安装、CUDA加速配置以及常见编译问题的解决方案。通过实战案例演示了从图像特征提取到稠密重建的完整步骤,并提供了性能优化和问题排查的实用技巧,帮助用户高效完成三维重建任务。

weixin_29003437的博客 1048

【一文读懂】NTN(非地面网络)技术介绍

NTN,即非地面网络,是指利用卫星、高空平台(如无人机、平流层气球等)等非地面通信基础设施来实现全球通信覆盖的网络。在5G时代,NTN主要基于5G标准,特别是5G NR(New Radio)技术,通过卫星通信扩展地面网络的覆盖范围和服务能力。NTN技术的出现和发展,为全球通信带来了新的可能性和挑战。通过不断的技术创新和标准化推进,NTN有望在未来发挥更加重要的作用,为全球用户提供无处不在的通信服务。随着6G时代的到来,我们有理由相信NTN技术将迎来更加广阔的发展前景。

u011376987的博客 1万+

c语言:联合体—union

关于联合体的说明

m0_73790767的博客 3950

别再瞎调参数了!用MATLAB fmincon优化傅里叶级数,为你的机器人设计“完美”激励轨迹

本文详细介绍了如何利用MATLAB的fmincon优化器设计机器人激励轨迹,通过优化傅里叶级数参数,解决传统试错法的低效问题。文章涵盖了目标函数设计、约束条件转化及优化算法选择,帮助工程师实现高精度的系统辨识和动力学参数优化。

weixin_42613501的博客 240

C/C++中的联合体union介绍

目录 union定义与简单使用 内存分配与所占空间 多种访问内存途径共存 数据存储位置 union应用之寄存器读取 union,中文名“联合体、共用体”,在某种程度上是类似结构体struct的一种数据结构,联合体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

会意的博客 4万+

永磁同步电机无传感器控制:HFI与ESMO技术详解

高频注入(HFI)和增强型滑模观测器(ESMO)是现代永磁同步电机(PMSM)无传感器控制的核心技术。HFI通过注入高频信号利用电机凸极效应获取转子位置,而ESMO则通过改进传统滑模观测器,有效抑制抖振并提升动态响应。这两种技术的结合特别适用于零低速区域的位置估计,在工业伺服、电动汽车等领域有广泛应用。方波高频注入作为实现方案之一,具有计算量小、实现简单的特点,配合自适应滤波等信号处理技术,可以在保证精度的同时降低系统成本。

weixin_29183637的博客 354

别再死磕DH参数了!用MATLAB Robotics Toolbox + SOLIDWORKS搞定六轴机械臂仿真(附避坑指南)

本文详细介绍了如何利用MATLAB Robotics Toolbox和SOLIDWORKS进行六轴机械臂仿真,避免常见的DH参数错误和模型导出问题。通过实战指南和避坑技巧,帮助工程师实现从三维建模到运动学仿真的无缝衔接,提升仿真效率和准确性。

weixin_27066963的博客 394

C语言巧用联合体union判定数据的存储格式(大小端)

联合体大家可能比较陌生,但是大家对结构体稍微熟悉一点吧。其实它们二个类似,只不过结构体成员占用不同的地址,而联合体所有成员占用。我们可以看出,低字节存储的是0x45对应的是value的低位0x45,所以低地址存储低位,利用这个特性我们就能判断在当前编译器下存储的数据的格式。我这里就通过代码的方法给大家讲解。

嵌入式 443

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 297

C语言联合体(Union)实战:如何用1个变量存储3种不同类型数据?

本文深入探讨了C语言联合体(Union)在嵌入式开发中的实战应用,通过传感器数据包解析、硬件寄存器映射等实例,展示了如何利用联合体与位域实现内存高效利用和精细控制。文章重点解析了联合体的内存共享特性、字节序影响以及结合位域访问硬件寄存器的经典模式,并强调了使用时的可移植性陷阱与最佳实践。

cuda7parallel的博客 1003

WPF数据绑定Binding对数据的转换与效验(四)

Binding的作用就是架在Source与Target之间的桥梁,数据可以在这座桥梁的帮助下来流通。就像现实世界中的桥梁会设置一些关卡进行安检一样,Binding这座桥上也可以设置关卡对数据的有效性进行检验,不仅如此,当Binding的两端要求使用不同的数据类型时,我们还可以为数据设置转换器。Binding用于数据有效性检验的关卡是它的ValidationRules属性,用于数据类型转换的关卡是它的Converter属性。

qq_30725967的博客 1627

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

[C&C++]联合体union的特征及用其进行传输

原创文章,欢迎转载。转载请注明:转载自 祥的博客 原文链接: 1. 联合体union的特征及应用 1.1. 特征 1.2. 特征 2. 使用union进行串口/UDP等数据传输 2.1. 用union定义传输协议 2.2. 赋值&amp;amp;amp;发送 2.3. 接收&amp;amp;amp;解析 1. 联合体union的特征及应用 1.1. 特征 在结构体(变量)中,结构的...

祥的专栏 3001

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【零基础学QT】【031】C++中的union联合体和Qt中的QVariant

//自定义类型 class User { public: int id; string name; }; //注册User和User*为元类型 Q_DECLARE_METATYPE(User) Q_DECLARE_METATYPE(User *) int main(int argc, char *argv[]) { QVariant va...

天天向上 Up Up Up (*^▽^*) 3886

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言学习——union(联合体、共用体)及应用

C语言union(联合体、共用体)及应用 在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置。联合(union)变量的所有成员共享同片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。 联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行。例如下面的描述定义了一个联合变量,并进行了初始化。 1 uunion data 2 { 3 cha...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 1935

C语言之联合体

联合union是一个能在同一个存储空间存储不同类型数据的类型 联合体所占的内存长度等于其最长成员的长度,也有叫做共用体 联合体虽然可以有多个成员,但同一时间只能存放其中一种 对于联合体来讲最基本的原则是,一次只操作一个成员变量,如果这个变量是指针,那么一定是处理完指针对应的内存之后再来使用其他成员 union variant{ int ivalue...

weixin_30299539的博客 71

浅谈C++联合体

1. 联合体 《C++ Primer Plus》第六版中关于联合体的描述是:共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。 联合体(union)(即共用体)的声明格式如下: union MyUnion { int iA; double dA; char cA; }; 关键字union表示MyUnion是一个联合体,MyUnion是一种用户自定义的数据类型,其使用方法如下: MyUnion Ua; Ua.iA=10; 根据《C++ Primer Plus

GeomasterYi的博客 2469

union的使用注意事项

union的定义:         中文翻译过来就是联合,其形式与结构很像,比如如下定义:       union people { unsigned long birthday; unsigned long phone; bool sex; char* pet; };       定义一个联合体,通过下面的程序来看其有什么特点      #include

阿黄啦啦 1807

C/C++中的联合体

利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员; 4)其对齐方式要适合其中所有的成员; 演示代码如下: #include<ios..

1 323

在C语言中,联合体或共用体(union )是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。

在C语言中,union是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。这意味着union中的所有成员共享同一块内存空间,因此它们之间会相互覆盖。在你给出的union由于union的特性,这三个成员中的任何一个都可以被存储在union分配的内存空间中,但一次只能存储一个成员的值。这意味着,如果你给type_16赋值,那么type_u8和type_u16的值将会变得不可预测(因为它们共享相同的内存位置),反之亦然。

qq_41883039的博客 464

联合体(Union)

定义:联合体的定义和结构体类似,不过它的所有成员共享同一块内存空间,这块空间的大小由占用内存最大的成员决定。使用场景:当需要存储不同类型的数据,但不需要同时使用它们时,使用联合体可以节省内存。

fbz123123258的博客 268
上一篇: 快速幂精解
下一篇: c++远征之离港篇
一giao窝里giao
博客等级 码龄11年 37粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值