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

发布时间 2023-12-17 20:40:13作者: 20231304王星婷

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

作业信息

这个作业属于哪个课程 2023-2024-1-计算机基础与程序设计
这个作业要求在哪里 2023-2024-1计算机基础与程序设计第十二周作业
这个作业的目标 《C语言程序设计》第11章并完成云班课测试
作业正文

教材学习内容总结

  1. 函数指针:函数指针是一种特殊的指针,它指向一个函数。通过函数指针,可以在运行时调用特定的函数。

  2. 数组指针:数组指针是一种指针,它指向一个数组的第一个元素。通过数组指针,可以访问数组中的各个元素。

  3. 字符串操作:C语言提供了许多字符串操作函数,如字符串拷贝、连接、查找、替换等。

  4. 动态内存分配:动态内存分配是一种在运行时分配内存的方法。通过动态内存分配,可以在程序运行时动态地分配和释放内存。

  5. 预处理器指令:预处理器指令是在编译之前处理的特殊指令,如宏定义、条件编译、文件包含等。

  6. 文件操作:C语言提供了文件操作函数,用于打开、关闭、读取、写入文件等。

  7. 库函数:C语言提供了许多库函数,如标准库(如输入输出、数学运算等)、字符库(如字符串操作、字符转换等)、动态库等。

  8. 错误处理:C语言提供了错误处理机制,如错误码、错误提示等,以便在程序出现错误时进行处理。

  9. 面向对象编程:C语言支持面向对象编程,通过结构体、联合体、枚举等实现面向对象编程的特性。

  10. 网络编程:C语言提供了网络编程的相关函数,如套接字创建、连接、接收发送数据等,用于实现网络通信功能。

基于AI的学习

我在学动态内存分配知识点,请你以苏格拉底的方式对我进行提问,一次一个问题

1.在动态内存分配中,为什么要使用指针?

这里是两个常见需要动态分配对象的情况:

(1)分配不限制作用域的对象,对象存储在其特定的内存中,而不是在内存中存储对象的拷贝。如果对象是可以拷贝/移动的,一般情况下你应该选择使用定义对象的方式。

(2)定义的对象会消耗大量内存,这时可能会耗尽栈空间。如果我们永远不需要考虑这个问题那该多好(实际大部分情况下,我们真不需要考虑),因为这个本身已经超出 C++ 语言的范畴,但不幸的是,在我们实际的开发过程中却不得不去处理这个问题。

当确实需要动态分配对象时,应该将对象封装在一个智能指针(smart pointer)或其他提供RAII机制的类型中(类似标准的 container)。智能指针提供动态对象的所有权语义(ownership)。如果使用得当,基本上可以避免自己管理内存

2.请解释动态内存分配的三个常用函数:malloc、calloc 和 realloc 的作用及区别。

(1)malloc在C语言中不是关键字而是C函数库中提供的函数。如果需要进行内存分配时在调用malloc时就是在内存池中提取一块内存空间(在堆上申请一块空间),但是这块空间是连续的空间。,并向该程序返回一个这块内存的指针。
(2)calloc和calloc的动态分配内存是有相同之处,他们的主要区别在于:
①在函数原型中calloc多了一个参数(他的参数是由所需元素的个数和每个元素的字节数组成)
②最大区别:calloc在调用完后返回指向内存的指针之前把他初始化为0
(3)ptr是指向原来地址的指针。
这个函数用于修改一个原先已经分配内存块的大小。
使用:
Ⅰ.可以使一块内存扩大或缩小(原来的内存块可以扩大缩小)
①如果是扩大一个内存块,则将原来的内存块保留在他的后边新增一块内存块(但是新增的内存块并未初始化)
②如果是缩小一块内存块,则将该内存块的后半部分直接拿掉,剩余部分内存块及其内容保留。
Ⅱ.原来的内存块无法扩大缩小
如果是着这种情况,realloc会重新开辟一个新的内存空间,并把原来的内存空间的内容拷贝到新的内存空间里。

3.在 C/C++ 程序中,如何实现内存的释放?

在C/C++程序中,实现内存释放的主要方法是使用内存分配函数(如malloc、calloc或new)和相应的内存释放函数(如free、delete或delete[])。

#include <iostream>
int main()
 {
    int *ptr = (int *)malloc(10 * sizeof(int));

    if (ptr == NULL) {
        std::cout << "内存分配失败" << std::endl;
        return 1;
    }// 使用分配的内存
    for (int i = 0; i < 10; i++) {
        ptr[i] = i;
    } // 释放内存
    free(ptr);

    return 0;
 }

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90
第五周 300/1600 2/11 20/110
第六周 200/1800 3/14 25/135
第七周 200/2000 1/15 20/155
第八周 200/2200 3/18 20/175
第九周 300/2500 1/19 15/190
第十周 250/2750 1/20 25/215
第十一周 250/3000 2/22 25/240
第十二周 200/3200 1/23 15/255