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

------------恢复内容开始------------

作业信息

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业
这个作业的目标 指针和数组
作业正文 本博客链接

教材学习内容总结

《C语言程序设计》第十一章 指针与数组 内容总结:

1. 指针和一维数组的关系

  • 数组名与指针
    • 在C语言中,数组名可以被看作是一个指针常量,它指向数组的第一个元素。例如,对于数组int a[5];a等同于&a[0],即a是指向a[0]的指针。
  • 通过指针访问数组元素
    • 可以使用指针来访问数组元素。例如:
    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("%d", *p);  // 输出1,即a[0]
    p++;
    printf("%d", *p);  // 输出2,即a[1]
    
    • 这里p是一个指向int类型的指针,通过p++可以顺序访问数组中的元素。

2. 指针和二维数组的关系

  • 二维数组的存储方式
    • 二维数组在内存中是按行顺序存储的。例如int a[2][3];在内存中的存储顺序是a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]
  • 指向二维数组的指针
    • 可以定义一个指针指向二维数组。例如:
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*p)[3] = a;
    printf("%d", *(*p + 1));  // 输出2,即a[0][1]
    
    • 这里p是一个指向包含3个int类型元素的数组的指针。通过*(*p + 1)可以访问二维数组中的元素。

3. 指针数组及其应用

  • 指针数组的定义
    • 指针数组是一个数组,其元素为指针类型。例如:
    int *a[3];
    int b = 1, c = 2, d = 3;
    a[0] = &b;
    a[1] = &c;
    a[2] = &d;
    
    • 这里a是一个包含3个int指针的数组,分别指向bcd
  • 应用 - 字符串数组
    • 指针数组常用于处理字符串数组。例如:
    char *strs[] = {"apple", "banana", "cherry"};
    for (int i = 0; i < 3; i++) {
        printf("%s\n", strs[i]);
    }
    
    • 这里strs是一个字符串指针数组,通过遍历可以输出每个字符串。

4. 动态数组

  • 动态内存分配函数
    • C语言中通过malloccallocrealloc函数来进行动态内存分配。
    • malloc函数:例如,分配一个包含5个int类型元素的动态数组:
    int *a = (int *)malloc(5 * sizeof(int));
    if (a == NULL) {
        // 内存分配失败处理
    }
    
    • calloc函数:除了分配内存,还会将内存初始化为0。例如:
    int *b = (int *)calloc(5, sizeof(int));
    
    • realloc函数:用于重新分配内存大小。例如,将上述a所指向的内存空间扩大:
    a = (int *)realloc(a, 10 * sizeof(int));
    if (a == NULL) {
        // 内存重新分配失败处理
    }
    
  • 动态数组的使用优势
    • 动态数组可以根据程序运行时的实际需求来分配内存,避免了静态数组在编译时就确定大小的局限性,提高了内存的利用率。

教材学习中的问题和解决过程(先问 AI)

一、指针和二维数组在内存中是如何存储的?
解答:这是个很好的问题。在内存中,二维数组是按行顺序存储的。

比如说有一个二维数组int a[2][3],它在内存中的存储顺序就像是把这个二维数组“展开”成一个一维数组一样。先是存储第一行的元素a[0][0]a[0][1]a[0][2],然后紧接着存储第二行的元素a[1][0]a[1][1]a[1][2]

从指针的角度来看,如果我们把二维数组的名字(比如a)看作是一个指针,这个指针指向的是二维数组的第一行(也就是第一个包含3个int类型元素的数组)。如果我们对这个指针进行算术运算,比如a + 1,它会根据二维数组的列数(这里是3)来计算偏移量,实际上会跳过第一行的3个元素,指向下一行(也就是第二个包含3个int类型元素的数组)。

二、什么是指针的偏移?
解答:指针偏移是指改变指针所指向的内存位置。

在C语言中,当我们有一个指针,比如int *p;,假设p当前指向一个内存地址,p++就是一种指针偏移操作。因为p是指向int类型的指针,p++会让p指向的地址增加sizeof(int)个字节。

对于数组来说,这种指针偏移就很有用。例如有一个一维数组int arr[5] = {1, 2, 3, 4, 5};int *p = arr;,最初p指向arr[0],当我们执行p++时,p就会指向arr[1],这是因为p的偏移量是根据int类型的大小来计算的。

对于二维数组,指针偏移会更复杂一点。假设有一个二维数组int a[2][3]int (*p)[3] = a;,这里p是一个指向包含3个int类型元素的数组的指针。当我们执行p++时,p会跳过一行(也就是3个int元素),指向二维数组的下一行。

基于AI的学习




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

问题一:ojCP1296输出元音字母个数的问题,自己交上的代码总显示部分接受
解决:自己发现每个字母输出一次即可,而自己的代码会使同一个元音字母输出多次

问题二:结构体编程题按成绩高低排序
解决:不能将所有结构体中声明的变量轮番呼唤,要换结构体变量的下标,否则程序运行不起来,而且改后更简单明了

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第十二周 600/3600 2/17 15/210
计划学习时间:20h
实际学习时间:20h

------------恢复内容结束------------

posted @ 2024-12-14 16:14  南极熊2  阅读(25)  评论(0)    收藏  举报