2023-2024-1 学号20231315第十三周学习总结

发布时间 2023-12-24 22:03:27作者: 向思源

学期:2023-2024-1 学号:20231315《计算机基础与程序设计》第十三周学习总结

作业信息

这个作业属于哪个课程 2023-2024-1 《计算机基础与程序设计》
这个作业要求在哪里 2023-2024-1 《计算机基础与程序设计》
这个作业的目标 学习《C语言程序设计》第12章
作业正文 https://i.cnblogs.com/posts/edit;postId=17924948

教材学习内容总结

本周我自学了《C语言程序设计》第12章的相关内容,对教材进行了总结。

《C语言程序设计》第12章总结

第12章主要介绍了结构体的定义及初始化,结构体指针,向函数传递结构体等

教材学习中遇到的问题

《C语言程序设计》第10章

  1. 什么是结构体?

    是一种用户自定义的数据类型,它可以包含多个不同类型的数据成员。结构体可以用于组织和存储相关的数据,使得数据的组织和访问更加方便和灵活。在C语言和C++中,结构体通常用于定义复杂的数据结构,如图形、员工信息等。在C++中,结构体还可以包含成员函数,从而实现面向对象的编程。

  2. 结构体中可以有结构体吗?

    是的,结构体中可以包含其他结构体作为成员变量。这种嵌套结构体的方式可以用来创建更复杂的数据结构,使得数据的组织更加灵活和清晰。例如,可以定义一个包含多个成员的结构体,其中某些成员可以是另一个结构体类型,实现了更复杂的数据组织和存储。这种嵌套结构体的方式对于管理复杂的数据非常有用。

  3. 如何用指针在函数中指向结构体内部某个量?

    在函数中使用指针指向结构体内部的某个量,需要先定义一个指向结构体的指针变量,然后通过指针变量来访问结构体成员的值。具体步骤如下:

    定义结构体类型。

    struct Student {
    char name[20];
    int age;
    float score;
    };

    定义指向结构体的指针变量。

    struct Student *pstu;

    在函数中给指针变量赋值。

    void func(struct Student *p)
    {
    pstu = p;
    }

    在函数中通过指针变量访问结构体成员的值。

    void print_info() {
    printf("Name: %s\n", pstu->name); // 通过指针变量访问结构体成员name的值
    printf("Age: %d\n", pstu->age); // 通过指针变量访问结构体成员age的值
    printf("Score: %.2f\n", pstu->score); // 通过指针变量访问结构体成员score的值
    }

    需要注意的是,在函数中使用指针指向结构体内部的某个量时,要先确保指针指向的结构体是有效的,否则会出现访问非法内存的问题。

  4. 共用体的应用?

    共用体(union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。共用体的内存大小取决于其最大的成员大小。共用体的应用包括以下几个方面:

    1. 节省内存:共用体可以节省内存空间,因为它们在同一时间只存储一个成员的值。这对于在不同时间只需要一个特定类型的数据时非常有用。
    2. 联合体的成员可以用于存储不同类型的数据,这在某些情况下可以提供灵活性。例如,一个共用体可以存储整数、浮点数和字符数组中的任何一种类型。
    3. 用于处理联合体的成员可以根据需要进行更改,这在某些特定的应用中非常有用。
    4. 共用体还可以用于处理特定的硬件结构,例如处理器寄存器或外设寄存器。

    总的来说,共用体通常用于需要在不同类型的数据之间进行转换,或者需要在不同类型的数据之间共享内存空间的情况下。然而,需要注意的是,由于共用体的特殊性,使用时需要特别小心,以避免出现意外的数据访问错误。

  5. 没有释放内存会产生哪些危害?

    如果没有正确释放动态分配的内存,会导致以下危害:

    内存泄漏:未释放的内存将无法再被程序使用,而且无法被操作系统回收。如果内存泄漏发生在循环中或重复执行的代码段中,每次迭代都会分配新的内存而不释放旧的内存,最终会耗尽可用内存,导致程序崩溃或变得非常缓慢。

    内存溢出:如果程序反复分配内存而不释放,最终可能会耗尽系统的可用内存资源,导致程序崩溃或操作系统无法正常工作。

    资源泄漏:除了内存之外,还有其他资源(如文件句柄、网络连接等)也可能会泄漏。如果不适时释放这些资源,会导致系统资源的浪费,可能会使系统性能下降或无法处理更多的请求。

    不可预测的行为:当未释放的内存被访问时,程序可能会产生未定义的行为。这种行为包括读取到无效数据、程序崩溃、数据损坏等。这是因为其他程序或操作系统可能会使用未释放的内存块,导致数据不一致或冲突。

    为了避免以上问题,务必在不再需要动态分配的内存块时,使用free函数进行释放。释放内存的原则是:每次调用malloccallocrealloc函数后,都应该有对应的free调用来释放已分配的内存块。这样可以保证内存的正确管理和有效利用。

    基于AI的学习

    我:我学习了本周我自学了《C语言程序设计》第12章的相关内容,并对教材进行了总结。请以苏格拉底的方式对我提问

AI:很高兴听到你自学了《C语言程序设计》第12章的相关内容并进行了总结。让我以苏格拉底的方式来和你对话。

告诉我,通过自学《C语言程序设计》第12章,你对C语言中的文件操作有了怎样的理解?在这一过程中,你是否遇到了什么令你困惑的问题?

我:第12章主要介绍了结构体的定义及初始化,结构体指针,向函数传递结构体等。

AI :在学习了《C语言程序设计》第12章。让我进一步问你几个问题:

  1. 在文件操作中,你学到了如何使用结构体来存储和管理数据。那么,结构体的定义和初始化在文件操作中起到了什么作用?你能举个例子来说明吗?
  2. 你提到了结构体指针的概念。在文件操作中,结构体指针有什么用处?你可以给出一个具体的应用场景吗?
  3. 向函数传递结构体是本章的另一个重点。你是如何理解向函数传递结构体的过程和意义的?是否遇到了一些困惑的问题?如果有,请分享一下。

通过回答这些问题,我们可以更深入地探讨你对《C语言程序设计》第12章内容的理解和应用。。

我:在文件操作中,结构体的定义和初始化起到了如下作用:

  • 定义结构体可以将不同类型的数据组织在一起,方便管理和存储。
  • 初始化结构体可以为结构体成员赋初值,便于后续操作。

举个例子,假设我们需要在文件中存储学生的信息,可以定义一个结构体来存储学生的姓名、年龄和成绩等信息:

struct Student {
char name[20];
int age;
float score;
};

然后可以定义一个结构体数组来存储多个学生的信息,并初始化每个学生的信息:

struct Student stu[3] = {
{"Tom", 18, 90.5},
{"Jerry", 19, 88.5},
{"Mike", 20, 85.0}
};

  1. 在文件操作中,结构体指针有以下用处:
  • 可以通过指针访问结构体的成员,方便对结构体进行操作。
  • 可以将指向结构体的指针作为参数传递给函数,方便在函数中对结构体进行操作。

举个例子,假设我们需要从文件中读取学生信息并进行处理,可以定义一个函数来读取学生信息并返回一个指向结构体的指针:

struct Student *read_student(FILE *fp) {
struct Student *pstu = (struct Student *)malloc(sizeof(struct Student));
if (fread(pstu, sizeof(struct Student), 1, fp) == 1) {
return pstu;
} else {
free(pstu);
return NULL;
}
}

然后可以在主函数中使用指针来访问读取到的学生信息:

struct Student *pstu;
FILE *fp = fopen("students.dat", "rb");
while ((pstu = read_student(fp)) != NULL) {
printf("Name: %s\n", pstu->name);
printf("Age: %d\n", pstu->age);
printf("Score: %.2f\n", pstu->score);
free(pstu);
}
fclose(fp);

  1. 向函数传递结构体的过程和意义如下:
  • 传递结构体可以将结构体作为一个整体传递给函数,方便对结构体进行操作。
  • 传递结构体指针可以避免在函数中复制整个结构体,节省内存空间。

需要注意的是,传递结构体时需要考虑结构体的大小和复制的开销。如果结构体很大,复制的开销也很大,可以考虑传递结构体指针来避免复制。同时,需要确保在函数中对结构体指针所指向的内存进行正确的访问和操作,避免出现非法访问的问题。

代码行数(新增/累积 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 200/250 4/4 20/25
第五周 300/300 3/3 20/20

以上是本周的学习进度条,我在代码行数、博客数量和学习时间上都有一定的增长,但仍需努二