2023-2024-1 20231326《计算机基础与程序设计》第十二周学习总结
2023-2024-1 20231326《计算机基础与程序设计》第十二周学习总结
作业信息
这个作业属于哪个课程 | 2023-2024-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2022-2023-1计算机基础与程序设计第X周作业 |
这个作业的目标 | 《C语言程序设计》第11章并完成云班课测试 |
作业正文 | https://www.cnblogs.com/gisliw/p/17909711.html |
教材学习内容总结
《计算机科学概论》
over.
《C语言程序设计》
第十一章 指针与数组
指针与一维数组的关系
- 数组名的特殊含义:数组的首地址
// 定义数组
int a[5];
此时,数组名a
等效于&a[0]
,即数组名相当于一个指针,其地址是数组首元素
同样,&a[2]
表示数组第三个元素地址,a + 2 == &a[2]
- 存在指针p指向数组a[5],即指向数组首地址:
int * p = a;
则有p + i == &a[i]
和*(p + i) == * &a[i] == a[i]
\((i <= 4, i \in \bf{Z})\)
注意: *p + i
是指a[0] + i
,是一个运算过程。
指针也可以使用下标:p[2] == *(p + 2) == a[2]
- 在函数传参时,可以用数组做实参传递,而用指针做形参接受:
#include<stdio.h>
void f(int *p, int n){
……
}
int main(){
int n;
int a[5];
// 传参,调用f()
f(a, n);
return 0;
}
指针与二维数组的关系
- 二维数组的行地址、列地址:
int a[3][3];
以下以矩阵的形式表示二维数组:
\[\begin{matrix}
a[0][0]&a[0][1]&a[0][2]\\
a[1][0]&a[1][1]&a[1][2]\\
a[2][0]&a[2][1]&a[2][2]\\
\end{matrix}\]
而实际上多为是线性存储的,按行存储:
\[\begin{matrix}
a[0][0]\\
a[0][1]\\
a[0][2]\\
a[1][0]\\
a[1][1]\\
a[1][2]\\
a[2][0]\\
a[2][1]\\
a[2][2]\\
\end{matrix}\]
a
指向首地址即&a[0][0]
的头字节;a + 1
指向的是第二行的头字节&a[1][0]
;a[1] + 1
指向的是第二行的第二元素的首字节&a[1][1]
-
a[i][j] == *(a[i] + j) == *(*(a + i) + j) == (*(a + i))[j]
-
引入指针,因此二维数组有两种指针,分别指向行、列两个维度:
// 定义行指针
int * p = a; // * p = &a[0]
则有:p[i][j] == *(p[i] + j) == *(*(p + i) + j) == (*(p + i))[j]
// 定义列指针:
int * p = a[0]; // p = *a 或者 p = &a[0][0]
则可以将数组a[3][3]
看作一个按行展开的一维数组b[9]
:
p + 5 == &b[5] == &(a[1] + 2)
指针数组
int *p[5];
该数组有五个元素,每个元素都是指针,即五个元素的值都为地址。
注意:定义指针数组时,最好对其进行初始化
动态内存分配 动态数组
- malloc()
void *malloc(unsigned int size);
注意:malloc() 返回值是五类型指针,需要手动强转成与指针同类型
使用时,先定义指针,再申请对应大小内存空间:
int * p = NULL;
p = (int *)malloc(2*sizeof(int));
- calloc()
void calloc(unsigned int num, unsigned int size);
// num 表示申请内存块的数量,size 是单个内存块的大小
以上的申请也可以用calloc():
int * p = NULL;
p = (int *)calloc(2, sizeof(int));
- free()
void free(void * p);
在使用完分配的内存后,需要手动释放,否则容易导致可用内存越来越少,最终导致崩溃:
free(p);
- 动态内存分配后,应先检查
if(p == NULL)
,排除分配失败的情况,否则将导致非法访问
教材学习中的问题和解决过程
基于AI的学习
代码调试中的问题和解决过程
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
其他(感悟、思考等,可选)
指针好难,得多看看
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十二周 | 100/200 | 3/2 | 20/20 |