1.什么是结构体
struct 结构体是 C 语言中的一种用户自定义的数据类型,可以用于组合多个不同类型的变量为一个实体,并以此为基础定义新的数据类型。关键字为struct,正如其名称所示,结构体通过将相关的变量组合在一起来创建一个结构,以便更好地组织和操作数据。
结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以方便日后的使用。
2.定义结构体
定义 struct 的一般语法如下
struct 结构体名称 {
类型 成员1;
类型 成员2;
// 更多成员定义
};
举个栗子~
下面演示一个简单的学生结构体的定义,包括学号、姓名和成绩:
struct Student {
int id;
char name[50];
float score;
};
在该示例中,我们定义了一个名为 Student 的结构体,它包含了学生的学号、名字和成绩,分别是整型、字符数组和浮点数类型。
3.结构体的实际应用
#include <>
// 定义学生结构体
struct Student {
int id;
char name[50];
float score;
};
int main() {
// 声明并初始化一个学生结构体变量
struct Student student1 = {12345, "Alice", 85.5};
// 访问结构体成员并打印信息
printf("学生信息:\n");
printf("学号: %d\n", );
printf("姓名: %s\n", );
printf("成绩: %.2f\n", );
return 0;
}
3.结构体有什么优点
结构体的存在意义是为了更好地组织复杂的数据,使代码更清晰、模块化和易于维护,也就是将不同的数据类型打包、封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
4.适用于什么场景
- 表示实体:结构体可用于表示真实世界中的实体,如学生、员工、订单等。通过将相关的属性组合在一起,我们可以更容易地描述和操作这些实体的数据。
- 组织复杂数据结构:结构体可以用于组织复杂的数据结构,如链表、树等。通过将结构体嵌套和组合,我们可以创建层次结构或复杂的数据结构来处理更大规模的数据。
- 模块化编程:结构体帮助我们创建模块化的代码。通过将相关的数据和功能组合在一起,我们可以更轻松地维护代码并扩展功能。例如,一个学生结构体可以包含所有与学生相关的数据和操作函数,使代码更易读和维护。
- 传递多个关联数据:结构体允许我们一次性传递多个关联的数据项。当需要在函数之间传递多个相关的数据时,可以使用结构体作为参数,提高代码的可读性和可维护性。
5.结构体的空间分配
在C语言中,结构体(struct)占用的内存空间取决于其内部包含的成员变量的大小和对齐方式。对于一个结构体来说,其内存大小将是其各个成员变量所占内存大小的总和,再加上由于对齐所增加的填充字节。
举个栗子~
struct Example {
int a;
char b;
double c;
};
struct Example Example1;
int main() {
printf("Example %d\n", sizeof());
printf("Example %d\n", sizeof());
printf("Example %d\n", sizeof());
printf("Example %d\n", sizeof(Example1));
return 0;
}
打印结果:
Example 4
Example 1
Example 8
Example 16
[Done] exited with code=0 in 2.824 seconds
理论上来说,结构体的大小应该是 4+1+8=13才对,为什么是16呢,这就是因为采用了4字节对齐的方式。
什么是字节对齐?
对齐方式是计算机系统中用来确定数据存储地址的规则,它确保数据在内存中以特定的边界开始存储。简而言之,对齐方式是指数据对象存储时所采用的地址对齐策略。比如每个数据的起始地址都是4的倍数,这就是4字节对齐,依次类推。
对齐方式是为了优化CPU对内存的访问,因为许多处理器在访问未对齐数据时需要额外的指令来处理,这会降低访问速度。通过对数据进行适当的对齐,可以最大程度地减少这种性能开销,提高程序的执行效率。
6.结构体指针
直接举栗~
#include <>
#include <>
// 定义结构体
struct Person {
int age;
char name[20];
};
int main() {
// 声明结构体指针
struct Person *personPtr;
// 为结构体指针分配内存
personPtr = (struct Person *)malloc(sizeof(struct Person));
// 操作结构体指针所指向的结构体
personPtr->age = 25;
strcpy(personPtr->name, "Alice");
// 输出结构体指针所指向的结构体的成员值
printf("姓名:%s\n", personPtr->name);
printf("年龄:%d\n", personPtr->age);
// 释放分配的内存
free(personPtr);
return 0;
}
7.结构体总结
结构体(struct)是 C 语言中的一种自定义数据类型,用于将不同类型的数据组合成一个整体。总结结构体的关键要点如下:
-
结构体用
struct
关键字定义,由多个不同类型的成员组成,每个成员可以有自己的数据类型和名称。 -
结构体变量可以在定义时初始化,也可以在之后分别初始化其成员。
-
结构体变量的访问使用点操作符
.
,指向结构体的指针变量的访问使用箭头操作符->
。 -
结构体可以作为函数的参数传递,也可以作为函数的返回值,从而方便地处理和操作复杂的数据结构。
-
结构体允许以更直观的方式表示复杂的数据,提高了程序的可读性和灵活性。
结构体在 C 语言中被广泛应用于各种场景,例如表示员工、学生、图书等实体,以及构建复杂的数据结构,如链表、树等。通过合理地使用结构体,可以更好地组织和处理程序中的数据。
注:结构体常常与typedef结合使用,这样会更方便,typedef会在下章更新~~~