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

发布时间 2023-12-17 21:57:03作者: GisliW

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的学习

image

代码调试中的问题和解决过程

代码托管

(statistics.sh脚本的运行结果截图)

上周考试错题总结

其他(感悟、思考等,可选)

指针好难,得多看看

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第十二周 100/200 3/2 20/20