当前位置: 首页 > ds >正文

C与指针——结构与联合

1、定义结构与初始化

struct A
{
int d1;
int d2[3];
};
A a={1,{1,1,1}};

2、补充内容:内存对齐

struct A
{char c1;int d1;char c2;
};
struct B
{char c1;int d1;char c2;double d2;
};

一般情况下,int 长度是4字节,要求起始地址与4对齐。那么该结构体中对对齐要求最严格的数据结构就是int,所以会强制让该结构的起始地址满足4的倍数要求。
在内存中会先存储c1,然后空3个字节(满足了d1地址被4整除要求),然后存d1,再存c2。然后再保留3个字节的空白位置。这样内存开销为12(1+3+4+1+3)
对于B,对齐要求为double(8),因此开销为24(1+3空+4+1+7空+8)
我们可以通过调整struct中变量的顺序来节约内存空间。A调整为

struct A
{
int d1;
char c1;
char c2;
};

这样内存开销为8(4+1+1+2)。
3、补充内容:联合和结构在函数传参的时会被完全拷贝一份,传入的是副本
4、补充内容:struct可以用于实现位段——按位分配内存

struct A
{
unsigned int d1:1;
unsigned int d2:1;
unsigned int d3:19;
};int main()
{A a;a.d1 = 0;a.d2 = 1;a.d3 = 122;
}

其中d1,d2,d3就被称之为位段。各占据1,1,19个位。
位段的数据类型只允许是unsigned int,int, signed int.三种。
5、联合——同一内存空间存不同类型数据

union A
{int d1;float d2;
};//4个字节的空间,即存储了d1又存储了d2.成员的类型决定了位是如何被解释的。
union A a;
a.d2 = 3.1415;
printf("%d",a.d1);

联合的sizeof 由联合中的最大元素决定,

union A
{int d1;double d2;
};
union A a;
a.d2 = 3.1415;
printf("%d",sizeof(a));//输出是8.

6、补充内容——sizeof()的参数可以是变量也可以是类型

http://www.xdnf.cn/news/4007.html

相关文章:

  • Feign的原理
  • cesium基础设置
  • xx外卖知识补充
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词
  • Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式
  • 详细案例,集成算法
  • 高等数学第三章---微分中值定理与导数的应用(3.3泰勒(Taylor)公式)
  • JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题
  • 解释一下NGINX的反向代理和正向代理的区别?
  • 【C++重载操作符与转换】下标操作符
  • Android学习总结之事件分发机制篇
  • Java大厂面试:Java技术栈中的核心知识点
  • 25.5.4数据结构|哈夫曼树 学习笔记
  • 深度学习在自动驾驶车辆车道检测中的应用
  • 硬件工程师面试常见问题(13)
  • 一个整数n可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数,详解
  • 5.4学习记录
  • 洛谷 P2473 [SCOI2008] 奖励关
  • TS 类型别名
  • ES6入门---第三单元 模块一:类、继承
  • 【操作系统】死锁
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • 【C语言入门级教学】VS使用调试技巧1
  • 算法笔记.求约数
  • 303.整数拆分
  • Seata TCC 实战笔记:从零搭建分布式事务 Demo (含源码)
  • Linux的时间同步服务器
  • 【LLM】deepseek R1之GRPO训练笔记(持续更新)
  • 【TF-BERT】基于张量的融合BERT多模态情感分析
  • 代码随想录算法训练营Day44