2024-2025-1 20241411王思棋《计算机基础与程序设计》第十二周学习总结
作业信息
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12 |
这个作业的目标 | 指针与数组 |
作业正文 | https://www.cnblogs.com/wangsiqi828828/p/18607254 |
教材学习内容总结
一、指针和一维数组的关系
- 基本关系
- 数组名是指向首元素的指针常量,和首元素地址相同。可以用指针遍历数组,如
*(ptr + i)
访问元素。
- 数组名是指向首元素的指针常量,和首元素地址相同。可以用指针遍历数组,如
- 指针运算
- 加法使指针后移,减法可算元素间隔,比较用于判断指针指向地址大小,用于判断是否在数组范围内。
- 函数参数关系
- 数组名作参数传递首地址。在函数中可通过指针修改数组内容。
- 延伸内容
- 可结合动态内存分配创建动态数组。访问数组时要注意边界检查,避免指针越界。
二、指针和二维数组的关系
- 可结合动态内存分配创建动态数组。访问数组时要注意边界检查,避免指针越界。
- 基本概念与存储方式
- 二维数组在内存中按行存储,可看作元素为一维数组的一维数组。指针用于访问和操作二维数组元素。
- 二维数组名与指针关系
- 二维数组名是指向第一个一维子数组的指针常量。和一维数组名不同,其偏移是一个子数组的地址。
- 通过指针访问元素
- 可用数组指针,如
int (*ptr)[4]=arr
,通过(*(ptr + i))[j]
访问arr[i][j]
。也可用普通指针间接访问,如int *p=&arr[0][0]
,通过*(p + 4*i + j)
访问arr[i][j]
。
- 可用数组指针,如
- 二维数组作为函数参数与指针关系
- 函数形参要明确第二维大小,形参实际是数组指针。在函数内可像主函数一样用指针访问和修改元素。
- 指针运算应用
- 指针加法和减法单位是子数组大小。指针比较用于判断所指子数组地址大小,对遍历和判断越界有用。
- 延伸内容
- 可动态分配二维数组,还涉及复杂的不规则二维数组,需要更复杂的指针操作和内存管理。
三、指针数组及其应用
- 可动态分配二维数组,还涉及复杂的不规则二维数组,需要更复杂的指针操作和内存管理。
- 概念
- 指针数组是数组,其元素为指针,如
int *arr[5]
包含5个指向int
类型的指针。
- 指针数组是数组,其元素为指针,如
- 初始化
- 可以在定义时初始化,例如将指针数组元素初始化为指向不同变量的指针。
- 与普通数组区别
- 普通数组存实际数据,指针数组存数据元素地址。
- 应用
- 字符串数组替代:用指针数组存储字符串更灵活,可避免二维字符数组存储字符串时的空间浪费。
- 多分支选择结构:定义函数指针数组,根据索引调用不同函数,实现多分支选择。
- 构建动态数据结构:如管理多个链表头节点,通过指针数组操作不同链表,包括初始化、插入和删除节点等。
四、动态数组
- 概念
- 动态数组是程序运行时能动态分配内存空间大小的数组,与编译时就确定大小的静态数组不同。
- 创建(内存分配)
- 用
malloc
分配指定字节数的连续内存,返回指向起始地址的指针,分配失败返回NULL
。 calloc
也分配内存,且会将内存初始化为0。realloc
用于重新分配已分配内存块的大小,成功返回新内存块起始地址指针,失败返回NULL
。
- 用
- 访问和使用
- 分配成功后像普通数组一样访问元素,可进行赋值、计算、排序等操作。
- 释放(内存回收)
- 不再需要时用
free
函数释放内存,避免内存泄漏,释放后不能再通过指针访问原数据。
- 不再需要时用
- 优势与应用场景
- 优势:灵活性高,避免静态数组空间浪费或不足的问题。
- 应用场景:处理不确定数量的数据,或作为数据结构底层存储方式,可根据操作需要灵活调整大小。
教材学习中的问题和解决过程(先问 AI)
- 问题1:数组元素的等价引用形式有哪些?
- 问题1解决方案:
索引:直接使用索引号访问,如 array[index]。
指针算术:使用指针加上偏移量来访问,如 *(array + index)。
数组名作为指针:数组名代表数组首元素的地址,可以像指针一样使用。
循环遍历:通过循环结构逐个访问数组元素。
切片:在支持切片的语言中,可以引用数组的一部分。
数组下标运算符:特定语言中用于访问元素的运算符。
解构赋值:直接从数组中提取元素到变量。
内置函数或方法:使用语言提供的函数或方法访问元素。
基于AI的学习
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
|
| 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长
|
|
-------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 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 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294
.html)
-
计划学习时间
:XX
小时 -
实际学习时间
:XX
小时 -
改进情况:
(有空多看看[现代软件工程 课件
软件工程师能力自我评价表](
http://www.cnblogs.com/xinz/p/3852177
.html))
参考资料
- 《计算机科学概论(第七版)》
- ...