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

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()的参数可以是变量也可以是类型

相关文章:

  • NPP库中libnppist模块介绍
  • Kubernetes 安装 kubectl
  • profile软件开发中的性能剖析与内存分析
  • 牛客周赛91 D题(数组4.0) 题解
  • RPG8.增加武器
  • 什么是右值引用和移动语义?大白话解释
  • Vue 虚拟DOM和DIff算法
  • 学习Linux的第一天
  • 初试C++报错并解决记录
  • 栈Stack
  • Javascript学习笔记1——数据类型
  • 第20节:深度学习基础-反向传播算法详解
  • Linux的时间同步服务器
  • Python 中的 collections 库:高效数据结构的利器
  • node核心学习
  • dpm_sysfs_add
  • 构建良好的 AI 文化:解锁未来的密钥
  • C++日志系统实现(二)
  • 李沐《动手学深度学习》 | Softmax回归 - 分类问题
  • 牛客周赛90 C题- Tk的构造数组 题解
  • 普京称俄中关系对维护世界稳定具有战略意义
  • 美国将于6月14日举行阅兵式,美媒报当天是特朗普生日
  • 五一假期首日,上海外滩客流超55万人次
  • 云南石屏举办茶文化交流活动:弘扬企业家精神,激发市场活力
  • 履新宿州市政府党组书记后,任东暗访五一假期安全生产工作
  • 特朗普宣布提名迈克·沃尔兹为下一任美国驻联合国大使