【重新学习C Day10 for 嵌入式Linux】

Day 10
1.
结构体中地址对齐
在一块连续的存储空间中 地址号码要能够整除数据类型所占大小 不然就要往下++1
设定0可以整除任何数

设下面有连续空间 struct 中存放 int char float 类型的内容 (不一定从0开始 这里只做说明用)

0		int开始         // 0%4  可以整除 从0地址开始
1
2
3		int结束
4		char开始 char结束          // 4%1 可以整除 
5							// 5%4 不可以整除 所以float 不能从这里开始 ++1
6							// 6%4  不可以整除	所以float不能从这里开始
7						// 7%4  不可以整除	所以float不能从这里开始
8		float 开始		// 8%4  可以整除	所以float从这里开始
9
10
11	float 结束         
12
13

由此可见 struct中数据的存放方式会影响struct的大小 5-7的空间以及不能另作它用 这也许是一种浪费 合理分配空间也是很必要的 当然 对齐可以通过特定的指令取消

一般函数在进行传参的时候不直接使用结构体 这样会加剧储存空间的开销(结构体很大时) 所以更好的方法是传指针(地址)

共用体与结构体的嵌套
可以利用 共用体的特性完成一些有趣的事情
因为共用体的特性,在同一时间,共用体中的数据只有一个有效 ! (是只有一个数据有效)

比如 我想计算一个32位数据的前两个字节和后两个字节的和 (这种问题在项目中有实际意义 比如对传感器回收数据的处理)

#include <stdio.h>
#include <stdlib.h>


union
{
	struct
{
	uint16_t i;
	uint16_t j;
}
	
	uint32_t y;

}a;

int main()
{
a.y=0x112223344;
printf(%x\n”,a.x.i+a.x.j);

}

!!!因为共用体的特性 共用体所占空间中的数据只能有0x11223344 这一个 但是在事实上,0x11223344这个数据是实实在在的放在 共用体的那四个字节的空间中的 两个16位的数据和一个32位的数据都是四个字节 而用共用体中嵌套的struct 去表达0x112233444这个数据的时候,其实对于空间中的数据来说,只是换了一个表达形式,数据的唯一性没有遭到破坏
这对我们来说是值得拓展思维的一个点

位域
位域在嵌入式应用中是有价值的 但是要注意大端小端的问题 如果是小端的话 会出现负值问题 这是因为补码存放的特性

union
{
	struct
{
	char a:1;
	char b:2;
	char c:1;
}
	
	int y;

}a;

可以利用第三条中描述的特性使用上述思想构造出的内容 比如给y赋值 但是能对数据进行更方便的位上的操作 但是还是那句话 要注意大端小端的问题

枚举 其实就是像是一个集合里放了很多宏 枚举怎么用?和结构体配合可以当作巨大的flag标志位来用(很紧凑) 在嵌入式中太有用了 也可以用来写交互内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值