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);
      

基于AI的学习

image

参考资料

posted @ 2024-12-14 11:52  20241329刘沛妤  阅读(7)  评论(0编辑  收藏  举报