2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十一周学习总结
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12 |
这个作业的目标 | 无 |
作业正文 | 本博客链接 |
教材学习内容总结
一、指针与数组的关系
- 内在联系
在C语言中,数组名可以被看作是一个指针常量,它指向数组的首元素地址。例如,对于一个整型数组int arr[5];
,数组名arr
就相当于一个指向arr[0]
的指针。可以通过指针运算来访问数组中的各个元素,指针的移动是以所指向数据类型的大小为单位的,这为遍历数组提供了一种灵活的方式。 - 通过指针访问数组元素
可以定义一个指针变量并让它指向数组,然后利用指针的偏移来读写数组元素。比如:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 让指针p指向数组arr的首元素
printf("%d", *(p + 2)); // 会输出数组中索引为2的元素值,即3
二、指向数组的指针
- 定义与初始化
可以定义指向数组的指针变量,形式如类型 (*指针变量名)[数组大小];
。例如,int (*p)[5];
定义了一个指针p
,它可以指向包含5个整型元素的数组。初始化时,可以将其指向一个已定义好的同类型同大小的数组,像int a[5]; p = &a;
这样操作后,p
就指向了数组a
。 - 指针运算特点
指向数组的指针进行算术运算时,会按照数组元素的个数来移动。例如上述p
指向a
数组,执行p++
操作时,p
会移动到下一个包含5个整型元素的数组的首地址(实际移动的字节数取决于整型的字节大小乘以5),这在处理多维数组等场景中非常有用。
三、多维数组与指针
- 二维数组与指针的关系
二维数组在内存中也是按行顺序存储的线性结构。对于二维数组int a[3][4];
,可以把a
看作是一个包含3个元素的一维数组,而每个元素又是一个包含4个整型元素的一维数组。可以定义指针指向二维数组的行,例如int (*p)[4] = a;
,这里p
指向a
的首行,通过p
的移动可以逐行访问二维数组的内容,同时也能用指针运算来访问具体的元素,如*(*(p + 1) + 2)
可以访问a[1][2]
这个元素。 - 更高维数组情况
类似的原理可以推广到更高维的数组,理解数组在内存中的存储顺序以及通过合适的指针定义和运算来访问各元素。
四、指针数组
- 定义与用途
指针数组是一个数组,其元素都是指针类型。例如int *arr[5];
就定义了一个包含5个元素的指针数组,每个元素都可以指向一个整型变量或者整型数组元素等。指针数组常用于字符串数组的表示,比如用字符指针数组来存储多个字符串,方便进行字符串的操作和管理。 - 初始化与操作
初始化时可以给各个指针元素赋予相应的地址值,在后续使用中可以通过数组下标访问不同的指针,进而通过指针访问所指向的数据内容,比如遍历字符串指针数组来输出各个字符串等操作。
五、数组指针作为函数参数
- 传递数组给函数
在C语言中,将数组作为函数参数传递时,实际传递的是数组的首地址(也就是一个指针)。形参可以用指针形式或者数组形式来接收,例如:
void func(int *arr, int n); // 指针形式接收
void func(int arr[], int n); // 数组形式接收(本质也是指针)
调用函数时可以直接传入数组名,像 int a[5]; func(a, 5);
这样,这样函数内部就能通过指针操作来访问和处理传入的数组元素了。
2. 二维数组作为函数参数
对于二维数组作为函数参数,需要明确指定第二维的大小,形参形式如 void func(int (*arr)[列数], int 行数);
,这样函数内部才能正确地通过指针运算来访问二维数组的各个元素,确保操作的正确性和内存访问的合法性。
总之,指针和数组在C语言中有着紧密的联系,掌握它们之间的关系以及相关的操作对于灵活运用C语言进行高效的程序设计、数据处理等方面有着至关重要的作用。
基于AI的学习
代码调试中的问题和解决过程
问题1:字符串没有正确倒序输出
症状: 程序输出的字符串顺序与预期相反,即从字符串的开头开始输出。
原因: 循环的起始条件设置错误,应该是 i = length - 1 而不是 i = 0。
解决: 检查循环的起始条件,并确保它是从字符串的最后一个字符开始。
问题2:输出包含字符串末尾的空字符
症状: 字符串正确倒序输出了,但是末尾多了一个空字符。
原因: 字符串在C语言中以空字符 '\0' 结尾,循环没有正确地排除这个空字符。
解决: 确保循环在遇到空字符之前停止。可以通过检查 str[i] != '\0' 来实现,或者更简单地,使用 length - 1 作为循环的上限,因为 strlen 函数返回的长度不包括空字符。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十二周 | 200/2400 | 2/20 | 10/240 |