- struct结构体--struct的对齐规则:先看一个代码:
#include<stdio.h> #include<string.h> //struct的对齐规则 struct S {char a;int b;char n; }; int main() {struct S s;printf("%d ", sizeof(struct S));return 0; }
这个代码中:打印出来的是12,但是我们知道char类型的是1个bite,int类型的是4个bite,那么不就是6个bite吗?为什么是12个呢?这就要讲到我们所说的struct的对齐规则了。它的原理其实很简单:1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处。
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
如果是这一个代码:
struct S s3
{char a;int b;char n;
};struct S4
{char c1;struct S3 s3;double d;
};
int main()
{struct S s4;printf("%d ", sizeof(struct S4));return 0;
}
这就需要另一个关于struct的对齐规则的是:如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
- 结构体的传参:t它的代码为:
struct S {int data[1000];int num; }; struct S s = { {1,2,3,4}, 1000 }; //结构体传参 void print1(struct S s) {printf("%d\n", s.num); } //结构体地址传参 void print2(struct S* ps) {printf("%d\n", ps->num); }int mian() {print1(s); //传结构体 print2(&s); //传地址 return 0; }
对与传参的代码,传地址比传结构体好的多。
- 我们再来总结一下,对于strucrt结构体,只需要知道它是如何创建和初始化的,以及它的结构体内存对齐。
- 联合体(union):它还有另一个名字叫做:共用体。它的创建和初始化则代码为:
//联合体的创建和初始化: union Un {char c;int a; }; int mian() {//联合体变量的定义union Un un = { 0 };//计算连个变量的大小printf("%d\n", sizeof(un));return 0; }
它的输出结果:4;那就想了,为什么结构体的是12,而联合体的是4呢?这就提到了前面所说的,联合体是一个共用体。它和结构体有着本质的区别,
-
联合体大小的计算:举一个例子:我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息,比如,设计这三个变量:图书:书名、作者、⻚数 。杯⼦:设计。 衬衫:设计、可选颜⾊、可选尺⼨。则代码为:
struct gift_list {int kucun_liang;//库存量char jia_ge;//价格int item_type;//商品类型union{struct{char title[20];//书名int name[10];//作者char num_pager;//页数}book;struct{char desight[30];//设计}mug;struct{char desight[20];//设计int jian_se;//可选颜色int size;//可选尺寸}shirt;}item; };
这就遇到了struct中嵌套了union。
-
结构体和联合体就写完了,它们的最重要的一部分就是struct和union的创建和初始化以及理解。你会了吗?