- 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的创建和初始化以及理解。你会了吗?