2024-2025-1 20241427 《计算机基础与程序设计》第13周学习总结
作业信息
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13 |
这个作业的目标 | 复习巩固前面所学的内容 |
作业正文 | https://www.cnblogs.com/2981586354yx/p/18622535 |
教材学习内容总结
一、结构体的定义
结构体是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。例如,如果你要描述一个学生的信息,可能包括姓名(字符串类型)、年龄(整数类型)、成绩(浮点数类型)等。在C语言中,结构体的定义形式如下:
struct student {
char name[50];
int age;
float score;
};
这里定义了一个名为 student 的结构体,里面包含了三个成员变量: name (字符数组用来存储姓名)、 age (整数用来存储年龄)、 score (浮点数用来存储成绩)。
2. 在C++ 中,结构体的定义除了上述类似C语言的定义方式外,还可以像类一样定义成员函数。例如:
struct Point {
int x;
int y;
Point(int a, int b) : x(a), y(b) {}
int getX() { return x; }
int getY() { return y; }
};
这个 Point 结构体有两个成员变量 x 和 y ,并且有一个构造函数和两个获取成员变量值的成员函数。
二、结构体变量的声明与初始化
声明
在C语言中,声明结构体变量有两种方式。一种是在定义结构体类型后直接声明变量,如前面定义的 student 结构体:
struct student s1;
另一种是使用 typedef 关键字给结构体类型取一个别名,然后再声明变量。例如:
typedef struct student {
char name[50];
int age;
float score;
} Student;
Student s2;
在C++ 中,声明结构体变量和C语言类似,但如果结构体定义中包含了构造函数,就可以直接初始化变量,如对于前面的 Point 结构体:
Point p(1, 2);
初始化
在C语言中,可以在声明结构体变量时进行初始化。对于前面的 student 结构体:
struct student s3 = {"Tom", 18, 90.5};
在C++ 中,如果结构体有构造函数,初始化时按照构造函数的参数要求进行。如果没有构造函数,也可以类似C语言的方式初始化成员变量。
三、结构体的嵌套
结构体可以嵌套其他结构体。例如,我们可以定义一个表示日期的结构体,然后在表示学生信息的结构体中嵌套这个日期结构体。
在C语言中:
struct date {
int year;
int month;
int day;
};
struct student_with_date {
char name[50];
int age;
struct date birth;
};
struct student_with_date s4 = {"Jerry", 20, {2004, 5, 10}};
在C++ 中,结构体嵌套的使用方式类似,只是在初始化和操作上可能会根据构造函数等情况有所不同。
四、结构体的内存布局
结构体的成员在内存中是按照定义的顺序依次存储的。但是,由于内存对齐的原因,可能会存在一些“空洞”。例如,在32位系统中,如果一个结构体有一个 char 类型(1字节)的成员,然后有一个 int 类型(4字节)的成员,那么 char 成员后面可能会填充3个字节,使得 int 成员的地址是4的倍数(32位系统中 int 的对齐要求)。
不同编译器可能对内存对齐有不同的处理方式。在C语言中,可以使用 #pragma pack 指令来设置结构体的对齐方式。在C++ 中,也有类似的机制来控制内存布局。
五、结构体的应用场景
数据组织
当需要处理一组相关但不同类型的数据时,结构体是很好的选择。比如在数据库管理系统中,一个表的记录可能包含多种类型的数据,如字符串类型的姓名、整数类型的年龄、日期类型的出生日期等,就可以用结构体来表示一条记录。
数据传递
在函数调用时,如果需要传递多个相关的数据,可以将它们组合成一个结构体,然后传递结构体变量。这样可以减少函数参数的个数,使代码更加简洁和易于维护。例如,一个绘制图形的函数可能需要图形的位置(x,y坐标)、颜色等信息,就可以将这些信息组合成一个结构体然后传递给绘制函数。
教材学习中的问题和解决过程
问题1:结构体的好处是什么?
解决方案:询问AI
AI:一、数据整合的便利性
结构体能够将不同类型的数据组合在一起。例如,在描述一个员工的信息时,可能包含姓名(字符串类型)、工号(整数类型)、工资(浮点数类型)、入职日期(结构体类型,包含年、月、日等整数类型成员)等。使用结构体可以把这些相关但类型不同的数据整合到一个单元中,使数据的表示更加直观。
对于复杂的数据结构,如链表、树等,结构体可以作为节点的基本组成部分。以链表为例,一个链表节点结构体可能包含数据域(存储实际的数据,其类型可以是各种基本类型或其他结构体类型)和指针域(指向下一个节点的指针),这样就方便地构建了链表这种数据结构。
二、函数参数的简化
当需要向函数传递多个相关的数据时,如果不使用结构体,可能需要传递多个单独的参数。例如,一个函数用于计算二维平面上一个点到原点的距离,若不使用结构体,可能需要分别传递点的x坐标和y坐标两个参数。
使用结构体后,可以将这些相关的数据封装在一个结构体中,然后只传递一个结构体变量作为函数参数。这样不仅减少了函数参数的数量,使函数的调用更加简洁,而且提高了代码的可读性和可维护性。例如,定义一个包含x和y坐标的点结构体 Point ,计算距离的函数只需要接收一个 Point 类型的参数即可。
三、数据的模块化和封装性
结构体可以隐藏内部数据的实现细节。类似于面向对象编程中的类,结构体内部的数据成员可以被看作是私有成员,外部只能通过特定的接口(函数)来访问和操作这些数据。虽然在C语言中结构体本身没有像C++ 类那样严格的访问控制机制,但可以通过函数来实现类似的效果。
在多人协作开发的项目中,结构体的使用可以将相关的数据和操作进行模块化。不同的开发者可以独立地开发和维护与结构体相关的功能,只要遵循结构体定义的接口规范,就不会影响到其他部分的代码。
四、内存管理的高效性
结构体在内存中的布局是按照成员的定义顺序依次存储的(考虑内存对齐)。这种布局方式在某些情况下可以提高内存的访问效率。例如,当频繁访问结构体中的连续成员时,由于它们在内存中是连续存储的,缓存命中率可能会提高,从而加快程序的运行速度。
对于动态分配内存的结构体数组或链表等数据结构,可以根据实际需要灵活地管理内存。例如,可以根据程序运行时的需求动态地增加或减少结构体数组的大小,或者动态地添加和删除链表中的节点,有效地利用内存资源。