目录
前言
1.结构体
1.1结构体的声明
1.2结构体变量的创建和初始化
1.3结构体成员的访问字符
1.4结构体的内存大小
1.4.1对齐规则
1.5结构体传参
前言
在编程的世界里,数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的场景,能够帮助我们更好地组织和管理数据。在本文中,我们将探讨三种常用的数据结构:结构体(Struct)、联合体(Union)和枚举(Enum),它们在C语言及其衍生语言中扮演着重要的角色。
1.结构体
结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的类型。这种能力使得结构体非常适合用于表示现实世界中的对象,比如一个员工的个人信息,可以包括姓名、年龄、职位等。结构体的使用可以提高代码的可读性和可维护性,因为它通过将相关的数据项封装在一起,使得数据的组织和访问变得更加直观。
1.1结构体的声明
例如描述一个学生:
1.2结构体变量的创建和初始化
这里采用了成员顺序初始化和指定顺序初始化两种方法,可以根据自己的需求自行选择。
1.3结构体成员的访问字符
上述例子中已经引用了结构体成员访问字符的一种( . ),这里再来详细的介绍一下结构体成员的访问字符。
如果你有一个指向结构体的指针,你可以使用箭头操作符(->
)来访问成员变量。下面是一个使用指针访问结构体成员的例子:
结果为:
这里我们也可以在指针前加上解引用符来使用点操作符。
结果依旧是相同的
1.4结构体的内存大小
结构体的内存大小就是所有成员内存大小的和吗?
这里给出个例子来看看:
结果为:
从结果上来看结构体的内存不是我们一开始所想的那么简单。
其实计算机给结构体分配内存的时候会遵循一个内存对齐规则。
1.4.1对齐规则
这里vs的对齐数默认为8。
Linux中gcc没有默认对齐数,对齐数就是成员自身的大小。
下来用代码和图示帮助大家理解结构体的内存对齐规则:
int main() {
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
}
运行结果为:
那么他是在内存中是怎么存储的呢?
第一个成员char对齐到和结构体变量起始位置偏移量为0的地址处,第二个成员变量int 对齐到它本身内存大小的倍数的位置,也就是表中的4。表中灰色部分为浪费的内存字节。第三个成员变量char和第二个成员存储规则相同也要对齐到它本身内存大小的倍数的位置,即对齐到第8个字节。最后结构体的内存总大小为最大对齐数的整数倍,也就是12。
趁热打铁再来看看这个结构体的内存大小。
int main() {
struct S2
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));
}
结果为:
那这个结构体是怎么存储呢?
是不是和你想的一样呢。
1.5结构体传参
上述的print1和print2函数哪个好一些呢?
答案是首选print2函数
原因是:
所以结论:
结构体传参的时候,要传结构体的地址。
C语言的联合体和枚举在下一篇博客,期待再见!