结构体类型:
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问 题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。
结构体变量的创建和初始:
比如我们想要描述一个学生的属性,就可以通过结构体来说明。
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
这就是最基础的结构体变量的创建和初始化
并且在访问结构体成员的时候可以通过 结构体变量.成员名或者结构体指针->成员名来访问
重点——介绍结构中存在的内存对齐:
我们已经掌握了结构体的基本使⽤了。 现在我们深⼊讨论⼀个问题:计算结构体的⼤⼩。 这也是⼀个特别热⻔的考点:结构体内存对⻬
对齐规则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。在VS中默认对齐数是8,Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
下面我们举例:
那么为什么会显示的12,而不是9呢?这是因为对齐规则3,所以结果必须是4的倍数
下面再看一个例题:
这个两个题目在结构体变量当中其变量是相同的,不过对于结构体变量的顺序是不同的,所以导致struct所占的内存大小是不同的,所以在我们创建结构体以及结构体成员变量的时候,可以将相同类型的变量放到一起,这样可以节省内存空间,大大提高了内存空间的利用率
下面我们在尝试一个题目的计算
这题的答案是16,各位读者不知道有没有算对!!!
这就是上面例题的解析图。
修改默认对⻬数:
#pragma 这个预处理指令,可以改变编译器的默认对⻬数。
重新定义了编译器的默认对齐数,那么对齐规则2就需要自己重新进行判断。
结构体传参:
上面给函数传递数据的时候,可以进行传递地址也可以进行传递参数,那么我们应该如何选择,选择哪一种方式更加的合适呢?答案肯定是传递地址更加好,原因如下:
结论: 结构体传参的时候,要传结构体的地址。