2024-2025-1 20241329 《计算机基础与程序设计》第十二周学习总结
作业信息
作业归属课程:2024-2025-1-计算机基础与程序设计
作业要求:2024-2025-1计算机基础与程序设计第十二周作业
作业目标:《C语言程序设计》第11章
作业正文:2024-2025-1 20241329 《计算机基础与程序设计》第十二周学习总结
教材学习内容总结
《C语言程序设计》第11章
1. 指针和一维数组间的关系
-
数组名作为指针常量:
数组名在表达式中代表数组首元素的地址,相当于一个指向数组首元素的指针。如,对于一维数组int a[5];
,a
等价于&a[0]
。 -
指针变量指向数组:
- 可以定义一个指针变量指向数组的首地址,如
int *p = a;
。 - 通过指针变量可以访问和修改数组元素,如
*(p + i)
等价于a[i]
。
- 可以定义一个指针变量指向数组的首地址,如
-
指针算术运算:
- 指针加减整数表示移动元素,如
p + 1
表示指向下一个元素。 - 两个指针相减表示元素个数,如
p2 - p1
表示两个指针之间的元素个数。
- 指针加减整数表示移动元素,如
-
指针与数组的等价性:
- 数组写法和指针写法在某些情况下具有等价效力,如
a[i]
等价于*(a + i)
。
- 数组写法和指针写法在某些情况下具有等价效力,如
-
数组名与指针的区别:
- 数组名是一个常量指针,不能被修改。
- 指针变量可以被重新赋值,指向不同的内存地址。
2. 指针和二维数组间的关系
-
二维数组的存储结构:
- 二维数组在内存中以行和列的方式存储,元素地址连续。
- 如,对于二维数组
int a[2][3];
,a
等价于&a[0][0]
。
-
数组名作为指针常量:
- 二维数组名在表达式中代表数组首元素的地址,相当于一个指向数组首元素的指针。
- 如,
a
等价于&a[0][0]
。
-
行指针和列指针:
- 行指针存储行地址,例如
int (*p)[3] = a;
,p
指向第一行。 - 列指针直接指向元素,例如
int *q = a[0];
,q
指向第一行的第一个元素。
- 行指针存储行地址,例如
-
指针算术运算:
- 指针加减整数表示移动元素,如
p + 1
表示指向下一个行。 - 如,
*(p + 1)
表示指向第二行的第一个元素,*(*(p + 1) + 1)
表示指向第二行的第二个元素。
- 指针加减整数表示移动元素,如
-
数组指针:
- 数组指针是指向数组的指针,定义时需指定数组类型和元素个数。
- 如,
int (*p)[3] = a;
,p
指向一个包含3个整数的一维数组。
3. 指针数组及其应用
-
指针数组的声明:
- 指针数组是用指针作为数组的基类型,元素为指针类型的数组。
- 如,
char *ptr[5];
表示一个包含五个字符指针的数组。
-
指针数组的应用:
- 指针数组常用于字符串数组和函数指针数组的实现。
- 如,
char *strs[3] = {"hello", "world", "C语言"};
。
-
动态内存分配:
- 可以使用
malloc()
和calloc()
函数动态分配内存,用于创建指针数组。 - 如,
char **ptrs = (char**)malloc(5* sizeof(char *));
。
- 可以使用
-
内存管理:
- 使用
free()
函数释放动态分配的内存,避免内存泄漏。 - 如,
free(ptrs);
。
- 使用
4. 动态数组
-
动态内存分配:
- 动态数组是在程序运行时根据需要分配和释放内存的数组。动态数组和动态内存分配允许程序在运行时根据需要调整大小,避免了预定义大小的限制。
- 使用
malloc()
、calloc()
、realloc()
等函数在堆上分配内存。 - 如,
int *arr = (int*)malloc(10 * sizeof(int));
、arr = (int *)realloc(arr, 20* sizeof(int));
。
-
创建动态数组:
- 例如,int *arr = (int *)malloc(n * sizeof(int));分配了一个包含n个int元素的动态数组。
-
内存管理:
- 需要使用
free()
函数手动释放动态分配的内存,忘记释放内存可能导致内存泄漏。
- 需要使用
-
动态二维数组:
- 创建动态二维数组需要两步分配:先分配行指针数组,然后为每行分配内存。
-
int **arr = (int **)malloc(m * sizeof(int *)); for (int i = 0; i < m; i++) { arr[i] = (int *)malloc(n * sizeof(int)); }
-
释放动态二维数组:
- 需要先释放每行的内存,然后释放行指针数组。
-
for (int i = 0; i < m; i++) { free(arr[i]); } free(arr);