首页 > 编程语言 ># 2024-2025-1 20241310 《计算机基础与程序设计》第12周学习总结

# 2024-2025-1 20241310 《计算机基础与程序设计》第12周学习总结

时间:2024-12-11 19:54:02浏览次数:11  
标签:10 arr 12 int 元素 2024 2025 数组 指针

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

作业信息

这个作业属于哪个课程 [2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第一周作业
这个作业的目标 自学教材《C语言程序设计》第11章并完成云班课测试
作业正文 本博客链接

教材学习内容总结

一、指针和一维数组的关系

(一)数组名作为指针常量

  1. 本质

    • 在C语言中,一维数组名可以看作是一个指针常量,它指向数组的第一个元素。例如,对于数组int arr[5];arr就相当于&arr[0],这个地址是常量,不能被重新赋值。
  2. 通过指针访问数组元素

    • 可以定义一个指针变量指向数组,然后通过指针来访问数组元素。例如:
    int arr[5] = {1, 2, 3, 4, 5}; 
    int *p = arr; 
    // 访问数组元素 
    printf("%d", *p); // 输出arr[0],即1 
    p++; 
    printf("%d", *p); // 输出arr[1],即2 
    
    • 这里p++操作会使指针指向下一个数组元素,因为p是指向int类型的指针,所以p++实际上是让p的地址值增加sizeof(int)字节。
  3. 指针算术运算与数组下标等效

    • 对于数组arr和指针pp = arr),arr[i]*(p + i)是等效的。这是因为数组在内存中是连续存储的,p + i表示从数组首地址偏移i个元素的地址,再通过*解引用就可以得到该地址存储的值,这与通过数组下标访问元素的效果相同。

(二)函数参数中的数组与指针

  1. 数组作为函数参数退化为指针
    • 当一维数组作为函数参数传递时,数组名会退化为指向数组首元素的指针。例如:
    void func(int arr[]) { 
        // 这里的arr实际上是一个指针 
    } 
    int main() { 
        int arr[5]; 
        func(arr); 
        return 0; 
    } 
    
    • 在函数func内部,无法通过sizeof获取数组的实际大小,因为arr已经是一个指针,sizeof(arr)得到的是指针的大小(在32位系统中为4字节,64位系统中为8字节),而不是数组的大小。

二、指针和二维数组的关系

(一)二维数组的存储结构

  1. 按行存储
    • 二维数组在内存中是按行存储的,即先存储第一行的所有元素,再存储第二行的元素,以此类推。例如,对于二维数组int arr[2][3];,其存储顺序为arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]arr[1][2]
  2. 数组名的含义
    • 二维数组名也是一个指针常量,它指向二维数组的第一个元素,不过这里的第一个元素是一个一维数组。例如,对于int arr[2][3];arr的类型是int (*)[3],它指向一个包含3个int元素的一维数组。

(二)通过指针访问二维数组

  1. 使用数组指针
    • 可以定义一个数组指针来指向二维数组,例如:
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; 
    int (*p)[3] = arr; 
    // 访问元素 
    printf("%d", (*p)[0]); // 输出arr[0][0],即1 
    p++; 
    printf("%d", (*p)[0]); // 输出arr[1][0],即4 
    
    • 这里(*p)[i]的形式用于访问二维数组中的元素,其中p是指向包含3个int元素的一维数组的指针,*p得到这个一维数组,再通过[i]访问其中的元素。
  2. 与一维数组指针的关系
    • 可以将二维数组看作是由多个一维数组组成的数组。例如,int arr[2][3]可以看作是一个包含2个元素的数组,每个元素是一个包含3个int元素的一维数组。从这个角度理解,二维数组名是指向一维数组的指针,而通过适当的指针运算可以访问到二维数组中的每个元素。

三、指针数组及其应用

(一)定义和初始化

  1. 定义
    • 指针数组是一个数组,其元素为指针类型。例如,int *arr[5];定义了一个包含5个元素的指针数组,每个元素都是指向int类型的指针。
  2. 初始化
    • 可以在定义时初始化指针数组,例如:
    int num1 = 1, num2 = 2, num3 = 3; 
    int *arr[3] = {&num1, &num2, &num3}; 
    
    • 这里arr[0]指向num1arr[1]指向num2arr[2]指向num3

(二)应用

  1. 字符串数组
    • 指针数组常用于表示字符串数组。例如:
    char *strs[] = {"hello", "world", "C language"}; 
    for (int i = 0; i < 3; i++) { 
        printf("%s\n", strs[i]); 
    } 
    
    • 这里strs是一个指针数组,每个元素指向一个字符串常量。这种方式比使用二维字符数组来存储字符串更加节省内存,因为字符串常量在内存中只存储一份,而指针数组只是存储了这些字符串常量的地址。
  2. 函数指针数组
    • 可以定义函数指针数组,用于根据不同的条件调用不同的函数。例如:
    int add(int a, int b) { 
        return a + b; 
    } 
    int sub(int a, int b) { 
        return a - b; 
    } 
    int (*func_arr[])(int, int) = {add, sub}; 
    int result = func_arr; // 调用add函数,result为3 
    

四、C程序的内存映像

(一)内存分区

  1. 栈区(Stack)
    • 由编译器自动分配和释放,用于存储函数的局部变量、函数参数等。例如:
    void func() { 
        int num = 10; // num存储在栈区 
    } 
    
    • 栈区的内存分配是从高地址向低地址增长的,函数调用结束时,栈上的局部变量会自动销毁。
  2. 堆区(Heap)
    • 由程序员手动分配和释放(使用malloccallocrealloc等函数分配,使用free函数释放),用于动态分配内存。例如:
    int *p = (int *)malloc(sizeof(int)); // 在堆区分配内存 
    *p = 10; 
    free(p); 
    
    • 堆区的内存分配是从低地址向高地址增长的。
  3. 全局区(静态区,Static)
    • 用于存储全局变量和静态变量。全局变量在整个程序的生命周期内都存在,静态变量的生命周期也贯穿整个程序的执行过程。例如:
    int global_num = 10; // 全局变量,存储在全局区 
    void func() { 
        static int static_num = 20; // 静态局部变量,也存储在全局区 
    } 
    
  4. 常量区
    • 用于存储常量数据,如字符串常量等。例如:
    char *str = "hello"; // "hello"存储在常量区,str是指向常量区的指针 
    
    • 常量区的数据是只读的,不能被修改。
  5. 代码区
    • 用于存储程序的可执行代码。

(二)内存布局示例

  1. 简单的C程序内存布局
    • 考虑以下程序:
    #include <stdio.h> 
    #include <stdlib.h> 
    
    int global_var = 10; 
    
    void func() { 
        int local_var = 20; 
        static int static_var = 30; 
        int *heap_var = (int *)malloc(sizeof(int)); 
        *heap_var = 40; 
    
        printf("global_var: %d\n", global_var); 
       
    
    
    
    

基于AI的学习

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 50/50 2/2 4/4
第二周 200/200 1/3 12/12
第三周 200/1000 1/4 10/10
第四周 400/400 1/5 12/12
第五周 200/1300 1/6 10/10
第六周 600/1000 1/7 10/10
第七周 400/500 1/8 9/9
第八周 600/600 1/9 10/10
第九周 800/800 1/10 12/12
第十周 800/800 1/11 10/10
第十一周 800/800 1/12 10/10
第十二周 800/800 1/13 10/10

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:XX小时

  • 实际学习时间:XX小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

标签:10,arr,12,int,元素,2024,2025,数组,指针
From: https://www.cnblogs.com/szt666/p/18600592

相关文章

  • 南京航空航天大学《2024年820自动控制原理真题》 (完整版)
    本文内容,全部选自自动化考研联盟的:《南京航空航天大学820自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~目录2024年真题Part1:2024年完整版真题2024年真题......
  • IDEA 2024.3 有效激活码,解决 We could not validate your license ff83b7bd51f5460ca4
    温馨提示:若激活失败或提示[keyisinvalid]的话需要完全卸载或尝试执行卸载脚本,然后重新安装即可解决;如果修改过host,请删除你添加的网址,如以前破解过,请完全卸载,重新安装;最新激活码激活失败,请重启重试。若提示Wecouldnotvalidateyourlicenseff83b7bd51f5460ca43aabd7a96......
  • 12.10 CW 模拟赛 T3. 循环
    算法很容易想到枚举短边断环之后\(\mathcal{O}(P)\)的求答案那么这个算法还有前途吗?可以发现,对于每次枚举断边,断\((i,i+1)\)和\((i-1,i)\)这两条边,变化量并不大,严格来说,均摊复杂度\(\mathcal{O}(P)\)具体实现上怎么处理呢?将断第\(x\)条边作为横......
  • 《计算机基础与程序设计》第12周学习总结
    2024-2025-120241300《计算机基础与程序设计》第12周学习总结作业信息这个作业属于哪个课程(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里(2024-2025-1计算机基础与程序设计第三周作业)这个作业的目标信息系统、数据库与SQL、人工智能与专家系统、人工神......
  • 241209 多imx415运行调试
    241209多imx415运行调试情况简述之前买过一块RK3588-RD-V12,四个imx415摄像头工作正常,后板子经常硬重启,怀疑板卡出现问题,购买一块新的RK3588-RD-V12,调试imx415过程中发现问题,具体表现为:四个摄像头只有两个注册成功注册成功摄像头无法用gst命令工作调试过程开机启动dmesg查......
  • 2024国城杯-Crypto
    babyRSA考察的是Schmidt-Samoa密码体系fromCrypto.Util.numberimport*importgmpy2n=5394038948719457798272021740613029703410824559283641374449628443590399241601631968636397327472613163520839237627603922775365911217062706807341755440934844235642236796284......
  • 2024鹏城杯-misc
    网安第一课改zip解压找到key1key26iMmn76ucYG9PDtsvu解压之后上脚本fromPILimportImageimages=[Image.open(f"{i}.png")foriinrange(1,38)]qr_code=Image.new("RGB",(128,128),(255,255,255))foriinrange(37):img1=images[i]......
  • 1203小组汇报展示:《曹冲称象》
    今天我们组进行了小组汇报,我们以《曹冲称象》为主题开展了一场的demo课堂展示。旨在将传统教学与AI巧妙融合。在展示环节,写字宝ai助力书写教学,豆包化身古人与学生互动,趣味十足。在我们前期准备的时候,视频生成软件让教学情境更生动,Scratch编程增添互动性。四位小组成员分工......
  • (2024最新毕设合集)基于的同城学校二手交易平台|可做计算机毕业设计JAVA、PHP、爬虫、AP
    同城学校二手交易平台设计与实现摘 要利用SpringBoot框架和相关Uni-app技术,设计和实现一个高效、可靠的同城学校二手交易平台。该系统将提供闲置、发布、求购等主要功能,旨在促进二手交易平台的便捷和透明化。本研究首先介绍了同城学校二手交易平台的研究背景和现状,包括同城......
  • 双12激战正酣,高效项目管理软件成电商决胜年末利器
    随着2024年电商双12的临近,各大电商平台和商家纷纷进入紧张的备战状态。商务部数据显示,截至12月7日24时,有2989.3万名消费者购买8大类家电产品4628.7万台,带动销售2038.1亿元。这一数据充分体现了消费者在年末的强大购买力,也为电商平台提供了巨大的市场机遇。在这个数......