学期:2023-2024-1 学号:20231315《计算机基础与程序设计》第十二周学习总结
作业信息
这个作业属于哪个课程 | 2023-2024-1 《计算机基础与程序设计》 |
---|---|
这个作业要求在哪里 | 2023-2024-1 《计算机基础与程序设计》 |
这个作业的目标 | 学习《C语言程序设计》第11章 |
作业正文 | https://i.cnblogs.com/posts/edit;postId=17909486 |
教材学习内容总结
本周我自学了《C语言程序设计》第11章的相关内容,对教材进行了总结。
《C语言程序设计》第11章总结
第11章主要介绍了指针和一堆数组的关系,指针和二堆数组的关系,向函数传递一堆和二堆数组,指针数组以及动态数组。
教材学习中遇到的问题
《C语言程序设计》第10章
-
p+1与p++有什么区别?
p+1和p++是两种不同的操作。
p+1是将指针p向后移动1个字节,即p当前所指的地址加上1个字节的地址偏移量,得到一个新的地址。
p++是指针p自增1,也就是将p所存储的地址自增1个字节,但是p++表达式的值仍然是原来p指向的地址。
因此,p+1和p++的区别在于,前者返回的是一个新的地址,而后者返回的是原指针指向的地址,并且会将指针本身的值自增1。
-
如何在函数中引用二堆数组并举例
#include <stdio.h>
// 函数中引用二维数组
void printArray(int (*arr)[3], int row, int col){
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
}int main()
{
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
printArray(arr, 2, 3);return 0;
} -
如何用指针表示二堆数组?
二维数组在内存中是连续存储的,因此可以使用指针来表示数组的首地址,然后通过指针进行遍历和操作。
下面是一个简单的示例,演示了如何使用指针表示二维数组:#include <stdio.h>
int main()
{
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ptr)[3];ptr = arr;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++){ printf("%d ", *(*(ptr + i) + j));
}
printf("\n");
}
return 0;
}
在这个示例中,我们定义了一个二维数组
arr
,然后定义了一个指向包含3个整数的数组的指针ptr
。我们将数组arr
的地址赋值给指针ptr
。然后,我们使用指针ptr
来访问 -
该用哪些函数动态分配内存?
在C语言中,可以使用以下函数动态分配内存:
malloc
函数:用于分配指定大小的内存块,返回一个指向该内存块的指针。calloc
函数:用于分配指定数量和大小的内存块,返回一个指向该内存块的指针。与malloc
不同的是,calloc
会将分配的内存块初始化为零。realloc
函数:用于重新分配已经分配的内存块的大小,返回一个指向该内存块的指针。如果需要扩大内存块,则会在原有的内存块末尾添加新的内存;如果需要缩小内存块,则会截取原有内存块的一部分。注意,使用realloc
函数时,必须先使用malloc
或calloc
函数分配内存。这些函数都需要传递一个参数,即所需内存块的大小(以字节为单位),并返回一个指向该内存块的指针。例如,要分配一个包含10个整数的数组,可以使用如下代码:
int* arr = (int*)malloc(10 * sizeof(int));
上述代码将分配包含10个整数的内存块,并返回一个指向该内存块的指针。需要注意的是,
malloc
函数返回的指针类型是void*
,因此需要进行强制类型转换。在使用完分配的内存块后,必须使用
free
函数将其释放,以便操作系统可以回收该内存。例如,要释放上面示例中分配的内存块,可以使用如下代码:free(arr);
注意,在释放内存块之前,一定要确保不再需要使用该内存块,否则可能导致内存泄漏或程序崩溃等问题。
-
没有释放内存会产生哪些危害?
如果没有正确释放动态分配的内存,会导致以下危害:
内存泄漏:未释放的内存将无法再被程序使用,而且无法被操作系统回收。如果内存泄漏发生在循环中或重复执行的代码段中,每次迭代都会分配新的内存而不释放旧的内存,最终会耗尽可用内存,导致程序崩溃或变得非常缓慢。
内存溢出:如果程序反复分配内存而不释放,最终可能会耗尽系统的可用内存资源,导致程序崩溃或操作系统无法正常工作。
资源泄漏:除了内存之外,还有其他资源(如文件句柄、网络连接等)也可能会泄漏。如果不适时释放这些资源,会导致系统资源的浪费,可能会使系统性能下降或无法处理更多的请求。
不可预测的行为:当未释放的内存被访问时,程序可能会产生未定义的行为。这种行为包括读取到无效数据、程序崩溃、数据损坏等。这是因为其他程序或操作系统可能会使用未释放的内存块,导致数据不一致或冲突。
为了避免以上问题,务必在不再需要动态分配的内存块时,使用
free
函数进行释放。释放内存的原则是:每次调用malloc
、calloc
或realloc
函数后,都应该有对应的free
调用来释放已分配的内存块。这样可以保证内存的正确管理和有效利用。基于AI的学习
我:我学习了本周我自学了《C语言程序设计》第11章的相关内容,并对教材进行了总结。请以苏格拉底的方式对我提问
AI:那么,请你分享一下你学习《C语言程序设计》第11章的相关内容的总结吧
我:第11章主要介绍了指针和一堆数组的关系,指针和二堆数组的关系,向函数传递一堆和二堆数组,指针数组以及动态数组。
AI :在学习了《C语言程序设计》第11章的指针和数组相关内容后,你对指针和数组的关系有什么深刻的理解呢?同时,在使用指针和数组时,有哪些需要特别注意的地方呢?请你分享一下你的见解。。
我:指针和数组在C语言中有着密切的关系,理解它们之间的联系对于编写高效、灵活的程序至关重要。我的理解是,指针和数组的关系体现在以下几个方面:
- 内存地址:数组名代表了数组元素的起始地址,而指针也存储了变量或者数组元素的内存地址。因此,可以将数组名视为指向数组首元素的指针,这意味着可以通过指针来访问数组元素。
- 数组名与指针的差异:虽然数组名可以被视为指向数组首元素的指针,但是数组名有其特殊性,例如不能被赋值,而指针可以被重新赋值指向不同的内存地址。
- 指针算术运算:利用指针进行算术运算可以实现对数组元素的遍历和访问,这在处理数组时非常有用。通过加法运算,可以让指针指向数组中的下一个元素,实现便捷的遍历操作。
在使用指针和数组时,需要特别注意以下几点:
- 越界访问:在使用指针和数组时,一定要避免越界访问,否则会导致未定义的行为,甚至引发程序崩溃。因此,需要在编程中保证指针和数组的访问始终在有效范围内。
- 空指针和野指针:在使用指针时,一定要注意指针的初始化和赋值,避免出现空指针和野指针的情况,以免引发程序错误。
- 内存泄漏:当使用动态内存分配函数如malloc()时,一定要及时释放内存,避免出现内存泄漏问题。
总的来说,指针和数组在C语言中有着紧密的联系,合理地应用指针可以提高程序的效率和灵活性,但同时也需要特别注意内存访问的安全性和合理性,以确保程序的稳定性和可靠性。
代码行数(新增/累积 | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 200/200 | 2/2 | 20/20 |
第二周 | 300/500 | 2/4 | 18/38 |
第三周 | 200/250 | 4/4 | 20/25 |
第五周 | 300/300 | 3/3 | 20/20 |
以上是本周的学习进度条,我在代码行数、博客数量和学习时间上都有一定的增长,但仍需努二
标签:arr,函数,学号,int,20231315,2024,内存,数组,指针 From: https://www.cnblogs.com/xisngsiyuan/p/17909486.html