首页 > 编程语言 >学期:2024-2025-1 学号:20241303 《计算机基础与程序设计》第十二周学习总结

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

时间:2024-12-14 16:44:00浏览次数:4  
标签:arr 访问 int 元素 2024 2025 数组 20241303 指针

作业信息

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第十二周作业)
这个作业的目标 <写上具体方面> 加入云班课,参考本周学习资源 自学教材《C语言程序设计》第11章并完成云班课测试
作业正文 ... 本博客链接

教材学习内容总结

《C语言程序设计》第11章:指针与数组

一、指针与数组的关系

在C语言中,数组名在很多情况下可以看作是一个指针。具体来说,数组名是指向数组第一个元素的指针(常量指针,不能对数组名本身进行赋值操作来改变它所指向的位置)。

例如,有一个整型数组int arr[5] = {1, 2, 3, 4, 5};,数组名arr就相当于一个指向arr[0]的指针。

  1. 通过指针访问数组元素

    • 可以定义一个指针变量来指向数组,然后通过指针来访问数组元素。例如:
      int *p;
      p = arr;  // 让指针p指向数组arr的第一个元素
      
    • 此时,*p就表示数组的第一个元素arr[0]*(p + 1)就表示arr[1],以此类推。这是因为在C语言中,数组元素在内存中是连续存储的,当指针p指向数组的第一个元素时,p + 1就指向数组的下一个元素(这里的加1实际上是根据指针所指向的数据类型的字节大小来移动的。对于int类型,一般情况下一个int占4个字节,所以p+1会移动4个字节,指向下一个int元素)。
  2. 指针运算与数组下标运算的等价性

    • 对于数组arr,访问数组元素arr[i]和通过指针p访问*(p + i)是等价的。这是因为数组下标的计算实际上也是基于指针的偏移。
    • 例如,在for循环中遍历数组:
      • 使用数组下标:
        for(int i = 0; i < 5; i++){
            printf("%d ", arr[i]);
        }
        
      • 使用指针:
        for(int i = 0; i < 5; i++){
            printf("%d ", *(p + i));
        }
        

二、数组作为函数参数时与指针的关系

当数组作为函数参数传递时,实际上传递的是数组的首地址,也就是一个指针。

  1. 函数形参中的数组和指针
    • 在函数定义中,以下两种形式是等价的:
      • 形式一:
        void func(int arr[], int n);
        
      • 形式二:
        void func(int *arr, int n);
        
    • 这两种形式都表示函数func接受一个整型数组(或指向整型的指针)和数组的大小n作为参数。
  2. 在函数内部操作数组元素
    • 当在函数内部通过形参来操作数组元素时,就如同操作指针一样。例如:
      void func(int *arr, int n){
          for(int i = 0; i < n; i++){
              printf("%d ", arr[i]);  // 等价于*(arr + i)
          }
      }
      

三、二维数组与指针

  1. 二维数组的存储方式
    • 二维数组在内存中也是按行顺序存储的。例如,有一个二维数组int matrix[3][4];,它的存储顺序是先存储第一行的4个元素,然后存储第二行的4个元素,最后存储第三行的4个元素。
  2. 指向二维数组的指针
    • 可以定义一个指针来指向二维数组的行。例如:
      • 定义一个指针int (*p)[4];,这个指针p可以指向一个包含4个int元素的数组(也就是二维数组的一行)。
      • 可以让p = matrix;,此时p就指向matrix的第一行。*(p + 1)就指向matrix的第二行。
    • 要访问二维数组中的元素,可以使用(*(p + i))[j]或者p[i][j]的形式(这里i表示行索引,j表示列索引)。这种方式和直接使用二维数组名matrix[i][j]在功能上是类似的,但通过指针的方式可以更加灵活地操作数组,比如在动态内存分配二维数组时会经常用到。

教材学习中的问题和解决过程

  1. 指针越界访问
    • 问题描述
      • 当指针指向数组元素时,如果不小心让指针超出了数组的范围,就会导致越界访问。这是因为C语言不会自动检查指针是否超出了数组边界。例如,对于数组int arr[5],定义一个指针int *p = arr;,如果在访问数组元素时使用*(p + 5)p[5],就会发生越界访问。
    • 后果
      • 越界访问可能会读取或修改不属于该数组的内存区域的数据。这可能导致程序出现错误的结果,比如读取到一些随机值或者修改了其他变量的值。更严重的是,可能会导致程序崩溃,因为有可能会访问到操作系统保护的内存区域或者已经被其他程序占用的内存。
    • 解决方法
      • 在使用指针访问数组元素时,要始终确保指针的偏移量在数组的有效范围内。可以通过检查指针的偏移量或者使用数组的长度来避免越界。例如,在一个循环中访问数组元素时,可以使用for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)来确保只访问数组内的元素,其中sizeof(arr)/sizeof(arr[0])可以计算出数组arr的元素个数。
  2. 数组名作为指针常量被错误赋值
    • 问题描述
      • 数组名本身是一个指针常量,它指向数组的第一个元素,不能被重新赋值。例如,对于数组int arr[5];,如果尝试arr = NULL;或者arr = another_array;是错误的。
    • 后果
      • 编译器会报错,因为这种赋值操作违反了数组名的常量属性。这样的代码无法通过编译。
    • 解决方法
      • 如果想要使用一个指针来操作数组,可以定义一个普通的指针变量,然后将数组名赋值给这个指针变量。例如,int *p = arr;,这样就可以通过指针p来操作数组,而不会出现对数组名进行非法赋值的情况。
  3. 指针类型不匹配导致的错误访问
    • 问题描述
      • 当指针的类型与它所指向的数据类型不匹配时,会导致错误的内存访问。例如,有一个char类型的数组char str[10];,如果定义一个int *p = (int *)str;,然后通过p来访问内存,就会出现问题。
    • 后果
      • 由于指针类型的错误,在访问内存时,会按照错误的类型来解析内存中的数据。在上述例子中,当通过p访问内存时,会按照int类型(通常占4个字节)来读取内存,而不是按照char类型(占1个字节),这会导致读取到的数据是错误的,而且还可能会访问到不属于str数组的内存区域。
    • 解决方法
      • 确保指针的类型与它所指向的数据类型一致。在上述例子中,应该定义char *p = str;来正确地访问char类型的数组。
  4. 二维数组指针操作的复杂性导致的错误
    • 问题描述
      • 在处理二维数组和指针时,容易出现混淆。例如,对于二维数组int matrix[3][4];,如果错误地定义指针或者错误地使用指针来访问数组元素,就会出现问题。如定义一个普通的int *p = matrix;(这里的类型不匹配,因为matrix是一个指向包含4个int元素的数组的指针类型),然后尝试使用p来访问二维数组元素就会出错。
    • 后果
      • 可能会导致错误的内存访问,程序可能会输出错误的结果或者崩溃。例如,按照错误的方式访问二维数组元素可能会读取到其他行或者列的数据,或者访问到非法的内存地址。
    • 解决方法
      • 正确理解二维数组与指针的关系。对于二维数组int matrix[3][4],应该定义int (*p)[4]=matrix;来正确地指向二维数组的行。在访问元素时,可以使用(*(p + i))[j]或者p[i][j]的形式来确保正确地访问二维数组中的元素。

基于AI的学习







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

问题:将一个数的每一位数字倒序后再输出这个数字
方法:

#include <stdio.h>

int main() {
    int num;
    int reversed = 0;
    printf("请输入一个整数: ");
    scanf("%d", &num);
    while (num!= 0) {
        reversed = reversed * 10 + num % 10;  // 取 num 的最后一位数字并添加到 reversed 的末尾
        num /= 10;  // 去掉 num 的最后一位数字
    }
    printf("倒序后的数字是: %d\n", reversed);
    return 0;
}

其他(感悟、思考等,可选)

需要多看课本。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第十二周 2100/3000 1/2 20/20
第十三周 300/500 2/4 18/38
第十四周 500/1000 3/7 22/60
第十五周 300/1300 2/9 30/90

标签:arr,访问,int,元素,2024,2025,数组,20241303,指针
From: https://www.cnblogs.com/dl2006/p/18606910

相关文章

  • 2024-2025-1 20241305《计算机基础与程序设计》第十二周学习总结
    ------------恢复内容开始------------作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标指针和数组作业......
  • Threejs教程,2024全新系统threejs入门教程
    Threejs教程,2024全新系统threejs入门教程https://www.bilibili.com/video/BV1Zm421g7oi/?spm_id_from=333.999.0.02401-theejs三要素WebGL顶点数据顶点索引矩阵三要素场景Scene容器相机Camera观察渲染器Renderer组合透视相机(PerspectiveCamera)http://www.we......
  • 2024年全网最新最详细《WebGL教程》
    2024年全网最新最详细《WebGL教程》https://www.bilibili.com/video/BV1AS411A74T/1202-canvas的基础知识https://bx2eq6ulg18.feishu.cn/docx/I4hTdO95qozPBOxauPlcbDfInVd2.1获取渲染上下文HTMLCanvasElement.getContext()方法用于返回绘图上下文对象,绘图上下文对象是2D上......
  • flutter零基础教程: Dart 3.5语法 flutter3.24 2024年8月27日更新
    flutter零基础教程:Dart3.5语法flutter3.242024年8月27日更新https://www.bilibili.com/video/BV1RZ421p7BL7 142024-8edu.51cto.com/course/36476.htmlP1课程大纲介绍P2002课程使用方法介绍和笔记使用P3003_mac系统查看笔记软件的安装方法和…..P4004黑苹果系统的......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标<写上具体方面>《C语言程序设计》第11章并完成云班课测试作业正文https://www.cnblogs......
  • 2024-2025-1 20241318 《计算机基础与程序设计》第十二周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标<自学教材《C语言程序设计》第11章并完成云班课测试>||作业正文|https://i.cnblogs.com/p......
  • nuxt3教程 2024年7月
    nuxt3教程2024年7月https://www.bilibili.com/video/BV11W421R7nC 1 2前置-一集搞明白客户端渲染和服务端渲染,多页面开发和spa单页面开发1安装介绍2服务端和客户端3基础配置4区分server和client,调试nuxt5路由的基本使用6命名路由,可选路由,全局路由7嵌套路由8编程......
  • NOIP2024
    T1显然,若\(t[l,r]\)均为\(\texttt1\),会让\(s[l,r]\)可以任意重排。从左到右按位匹配,考虑让一位匹配的代价,可能会让其后面缺少一个数进行匹配,也就是后面的答案最多减少\(1\)。而匹配一位已经有了\(1\)的贡献,故贪心匹配一定不劣。预处理后暴力匹配即可,附上赛时代码。#in......
  • 【2024年最受欢迎Angular课程】零基础自学的前端框架完整版教程
    【2024年最受欢迎Angular课程】零基础自学的前端框架完整版教程https://www.bilibili.com/video/BV1FZ42127cd/ 1-1015+1901、angular介绍angular.cnngserve--openvite...angular112.2主要特性1.AngularCLI可以快速搭建框架,创建module,service,class,directive等2......
  • 特斯拉 Model Y 2022 款与 2024 款置换评估报告--多个AI对话模型能力测评报告
    特斯拉ModelY2022款与2024款置换评估报告题目:车主买modelY2022款花了280900元,贷款5年,首付是130000元,五年贷款有利息,月缴费是3072元,缴费了25个月,该车还贴了7242车身膜,2000的玻璃膜,第三方评估价值160000元,偿还招商银行的未还的金额后剩余的钱可以用来当新款的首付,考......