结构体与共用体详解

文章探讨了C语言中如何通过数组、结构体和共用体来组合不同类型的数据。结构体的内存对齐原则被提及,以及如何通过typedef和预处理指令#pragmapack调整对齐方式。位域技术在节省内存空间方面的应用也被讨论,但要注意其可移植性和对性能的影响。共用体的特点是内存共享,先定义的成员会被后定义的覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多个数据组合的空间

1、相同数据类型组合的空间

c语言提供数组的概念来封装具有多个相同数据类型的空间,但是c语言不承认有数组类型。

2、不同数组类型组合的空间

在原子类型基础上,若能将更多的类型打包成一个类型,那么访问和程序设计时,将会更容易,根据打包形势分成结构体(struct)和共用体(union)。

二、

typedef ;

(默认规则)结构体 为了提高内存访问效率,在软件编译时,会引入字节对齐的规则;

1、结构体中最大的基本数据类型作为对齐标准;

2、根据/2原则,依次填充;

调整结构体对齐使其紧凑即可实现数据紧凑合并;

也可以指定规则,可以指定对齐方式;#pragma pack (1)【#预处理处理】包按1b对齐来分;

三、共用体封装方式,访问方法;

位域

位域是一种在结构体中定义成员时,可以指定其占用的位数的技术。通过使用位域,可以在一定程度上节省内存空间,因为可以将多个成员压缩在同一个字节或单词中。在定义位域时,需要指定成员名、占用的位数和数据类型。例如:

struct { unsigned int flag1 : 1; unsigned int flag2 : 2; unsigned int flag3 : 3; } myFlags;

上面的代码定义了一个结构体 myFlags,其中包含三个位域成员 flag1flag2flag3,它们分别占用了 1、2 和 3 个二进制位。这样,可以使用一个字节(8 个二进制位)来存储这三个成员的值。

需要注意的是,不同编译器对位域的实现可能会有所不同,因此在使用位域时需要注意可移植性。另外,位域的使用也可能会影响程序的性能,因为访问位域成员需要进行位运算,而这可能比访问普通成员更耗时。

芯片里一个区域控制一个功能;内存中以16进制表示出来,运用了unsigned int b1:3(分配空间三位);unsigned int b1:4(分配空间4位)这个语法,可以控制寄存器位的数据;也可以对整个32位赋值(对于32位寄存器);

 

共用体内存共用,先定义的会被后定义的覆盖;val会b1定义的值覆盖

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值