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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值