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

发布时间 2023-12-17 18:08:29作者: 向思源

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

作业信息

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

教材学习内容总结

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

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

第11章主要介绍了指针和一堆数组的关系,指针和二堆数组的关系,向函数传递一堆和二堆数组,指针数组以及动态数组。

教材学习中遇到的问题

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

  1. p+1与p++有什么区别?

    p+1和p++是两种不同的操作。

    p+1是将指针p向后移动1个字节,即p当前所指的地址加上1个字节的地址偏移量,得到一个新的地址。

    p++是指针p自增1,也就是将p所存储的地址自增1个字节,但是p++表达式的值仍然是原来p指向的地址。

    因此,p+1和p++的区别在于,前者返回的是一个新的地址,而后者返回的是原指针指向的地址,并且会将指针本身的值自增1。

  2. 如何在函数中引用二堆数组并举例

    #include <stdio.h>

    // 函数中引用二维数组
    void printArray(int (*arr)[3], int row, int col)

    {
    for (int i = 0; i < row; i++)

    {
    for (int j = 0; j < col; j++)

    {
    printf("%d ", arr[i][j]);
    }
    printf("\n");
    }
    }

    int main()

    {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};


    printArray(arr, 2, 3);

    return 0;
    }

  3. 如何用指针表示二堆数组?

    二维数组在内存中是连续存储的,因此可以使用指针来表示数组的首地址,然后通过指针进行遍历和操作。

    下面是一个简单的示例,演示了如何使用指针表示二维数组:#include <stdio.h>

    int main()

    {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*ptr)[3];

    ptr = arr;

    for (int i = 0; i < 2; i++)

    {
    for (int j = 0; j < 3; j++)

    { printf("%d ", *(*(ptr + i) + j));

    }

    printf("\n");

    }

    return 0;

    }

    在这个示例中,我们定义了一个二维数组arr,然后定义了一个指向包含3个整数的数组的指针ptr。我们将数组arr的地址赋值给指针ptr。然后,我们使用指针ptr来访问

  4. 该用哪些函数动态分配内存?

    在C语言中,可以使用以下函数动态分配内存:

    malloc函数:用于分配指定大小的内存块,返回一个指向该内存块的指针。

    calloc函数:用于分配指定数量和大小的内存块,返回一个指向该内存块的指针。与malloc不同的是,calloc会将分配的内存块初始化为零。

    realloc函数:用于重新分配已经分配的内存块的大小,返回一个指向该内存块的指针。如果需要扩大内存块,则会在原有的内存块末尾添加新的内存;如果需要缩小内存块,则会截取原有内存块的一部分。注意,使用realloc函数时,必须先使用malloccalloc函数分配内存。

    这些函数都需要传递一个参数,即所需内存块的大小(以字节为单位),并返回一个指向该内存块的指针。例如,要分配一个包含10个整数的数组,可以使用如下代码:

    int* arr = (int*)malloc(10 * sizeof(int));

    上述代码将分配包含10个整数的内存块,并返回一个指向该内存块的指针。需要注意的是,malloc函数返回的指针类型是void*,因此需要进行强制类型转换。

    在使用完分配的内存块后,必须使用free函数将其释放,以便操作系统可以回收该内存。例如,要释放上面示例中分配的内存块,可以使用如下代码:

    free(arr);

    注意,在释放内存块之前,一定要确保不再需要使用该内存块,否则可能导致内存泄漏或程序崩溃等问题。

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

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

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

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

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

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

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

    基于AI的学习

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

AI:那么,请你分享一下你学习《C语言程序设计》第11章的相关内容的总结吧

我:第11章主要介绍了指针和一堆数组的关系,指针和二堆数组的关系,向函数传递一堆和二堆数组,指针数组以及动态数组。

AI :在学习了《C语言程序设计》第11章的指针和数组相关内容后,你对指针和数组的关系有什么深刻的理解呢?同时,在使用指针和数组时,有哪些需要特别注意的地方呢?请你分享一下你的见解。。

我:指针和数组在C语言中有着密切的关系,理解它们之间的联系对于编写高效、灵活的程序至关重要。我的理解是,指针和数组的关系体现在以下几个方面:

  1. 内存地址:数组名代表了数组元素的起始地址,而指针也存储了变量或者数组元素的内存地址。因此,可以将数组名视为指向数组首元素的指针,这意味着可以通过指针来访问数组元素。
  2. 数组名与指针的差异:虽然数组名可以被视为指向数组首元素的指针,但是数组名有其特殊性,例如不能被赋值,而指针可以被重新赋值指向不同的内存地址。
  3. 指针算术运算:利用指针进行算术运算可以实现对数组元素的遍历和访问,这在处理数组时非常有用。通过加法运算,可以让指针指向数组中的下一个元素,实现便捷的遍历操作。

在使用指针和数组时,需要特别注意以下几点:

  1. 越界访问:在使用指针和数组时,一定要避免越界访问,否则会导致未定义的行为,甚至引发程序崩溃。因此,需要在编程中保证指针和数组的访问始终在有效范围内。
  2. 空指针和野指针:在使用指针时,一定要注意指针的初始化和赋值,避免出现空指针和野指针的情况,以免引发程序错误。
  3. 内存泄漏:当使用动态内存分配函数如malloc()时,一定要及时释放内存,避免出现内存泄漏问题。

总的来说,指针和数组在C语言中有着紧密的联系,合理地应用指针可以提高程序的效率和灵活性,但同时也需要特别注意内存访问的安全性和合理性,以确保程序的稳定性和可靠性。

代码行数(新增/累积 博客量(新增/累积) 学习时间(新增/累积)
目标 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

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