上节写到结构体对齐数,以及系统默认对齐数的修改,以及对齐数为何出现,实际上是牺牲一部分空间来换取读取速度也就是时间的方法。
在这里插入一段结构体函数传参的内容
以下代码为结构体初始化,使用自定义函数进行初始化,传递的时候使用了结构体地址。
struct S
{
int a;
char c;
double d;
};
void init(struct S* ps)
{
ps->a = 100;
ps->c = 'w';
ps->d = 3.14;
}
int main()
{
struct S s = { 0 };
init(&s);
return 0;
}
设计两个打印函数,对比传值和传址的区别
struct S
{
int a;
char c;
double d;
};
void init(struct S* ps)
{
ps->a = 100;
ps->c = 'w';
ps->d = 3.14;
}
void print1(struct S tmp)
{
printf("%d %c %lf\n", tmp.a, tmp.c, tmp.d);
}
void print2(struct S* pss)
{
printf("%d %c %lf\n", pss->a, pss->c, pss->d);
}
int main()
{
struct S s = { 0 };
init(&s);
print1(s);
print2(&s);
return 0;
}
1.接下来写接着上节,继续写结构体相关内容,结构体的位段操作
结构体位段操作,实际上是为了节省空间。如下图所示,一个 int整型,大小是4个字节,占32个比特位,在位段操作之后,int a :2;只占取2个比特位。开辟空间时,如下图所示,先开辟一个整型,32个比特位,先存放占2个比特的a,再存放占5个字节的b,再存放10个字节的c,然后一个整型只剩下15个比特位,不够存放d,这时候就需要再创建一个整型,来存放d。加起来整个结构体的大小就是64个比特位,8个字节。
下图是char类型的结构体使用位段操作,存放时写入的数据超出了位段预留的空间,溢出的数据不会存储,如下图所示。
位段虽然可以节省空间,但是这种存储方式在跨平台的时候有很的大的问题
网络聊天发送数据的一种位段应用,节省空间到极致