| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> |3 Day03 标准C语言6 -> 正文阅读 |
|
[C++知识库]|3 Day03 标准C语言6 |
指针数组与数组指针: ????指针数组:?(选择题) ????????就是由指针变量组成的数组,它的成员是指针变量 ????????int*?arr[10]; ????数组指针:?(了解) ????????专门指向数组的指针 ????????类型?(*arr)[长度] ????????int?(*arr)[10]; 指针与数组名: ????数组名可以看做一种特殊的指针,它是常量,不能修改它的值 ????数组名与数组的内存之间是映射关系,而指针变量与内存之间是指向关系 ????数组名是没有自己的存储空间 ????数组名?==?&数组名?==?&数组名[0] ????如果指针变量中存储的是数组的首地址,指针可以当做数组使用,数组名也可以当做指针来使用 ????数组名[i]?==?*(数组名+i) ????*(p+i)?==?p[i] ????数组作为函数的参数时蜕变成了指针,所以长度会丢失 二级指针:?(需要共享指针变量的时候) ????二级指针就是指向指针的指针,里面存储的是指针变量的地址 ????定义:???类型**?变量名_pp; ????赋值:???变量名_pp?=?&指针变量; ????解引用:?*变量名_pp?<=>?指针; ????解引用:?**变量名_pp?<=>?*指针?<=>?普通变量 函数指针: ????函数名就是该函数在代码段中的内存首地址 ????调用函数就是跳转到该函数所在的代码段中去执行二进制指令 ????函数指针就是专门用来指向函数的指针,里面存储的是函数的首地址,对函数指针解引用就可以执行函数 ????函数指针可以当做函数使用 ????定义函数指针: ????????返回值?(*指针变量名)(类型1,类型2,...) ????赋值: ????????指针变量名?=?函数名; ????调用函数: ????????指针变量名(实参); ????通过函数指针或函数名,把函数当做参数一样传递给另一个函数使用,这就是回调(在函数中需要调用其他函数的时候) ???? ????134513504?scanf的地址 函数递归: ????函数自己调用自己的行为叫做递归,处理不当可能导致出现死循环的效果 ????递归可以实现一种叫做分治的算法思想,把一个复杂的大问题,分解成若干个相同的小问题,直到问题全部解决 ???? ????1、设置出口 ????2、解决一个小问题 ????3、调用自己 ????递归函数每次调用自己都会在栈内存产生一份自己的拷贝,直到到达出口,才一层层释放,因此递归非常耗费内存,与循环相比速度非常慢 ????能用循环解决的问题就不要使用递归 ????????递归优缺点: ????????????1、耗费内存、速度慢 ????????????2、好理解、思路清晰 ????????????3、可以解决非线性问题的执行过程 //练习1:?尝试使用递归计算第N项斐波那契数列 //作业1:?使用递归模拟汉诺塔的移动过程 //作业2:?实现打印?0~9?的全排列 堆内存: ????什么是堆内存: ????????是进程的一个内存段(text\data\bss\heap\stack),由程序员手动管理的 ????????特点是足够大,缺点是使用比较麻烦 ????为什么要使用堆内存: ????????1、随着程序的复杂数据量变多 ????????2、其它的内存段的申请和释放不受控制,堆内存的申请释放受程序员控制 ????如何使用堆内存:?(掌握前2个,后2个了解) ????????注意:?C语言没有控制管理堆内存的语句,只能使用标准C库中的函数来使用 ????????//#include?<stdlib.h> ????????void?*malloc(?size_t?size?); ????????功能:?从堆内存中申请size个字节的内存,申请的内存存储是什么内容不确定(不会自动清0) ????????返回值:?申请成功后返回该内存的首地址,失败返回NULL ????????void?free(?void?*ptr?); ????????功能:?释放一块堆内存,不能重复释放或者释放非法地址,但是可以释放NULL ????????注意:?释放的仅仅是使用权,里面的数据不会全部清理,只会清理前4个字节为0 ????????void?*calloc(?size_t?num,?size_t?size?); ????????功能:?申请nmenb块,每块size个字节的堆内存,申请的内存会被全部初始化为0 ????????返回值:?申请到的依然是一块连续的内存 ????????void?*realloc(?void?*ptr,?size_t?size?); ????????功能:?改变已有内存块的大小 ????????ptr:?要调整的内存块的首地址 ????????size:?调整后的字节大小 ????????返回值:?返回的是调整后的内存块的首地址,一定要重新接收返回值,因为可能不是在原基础上进行调整 ????????????如果无法在原基础上调整: ????????????????1、申请出一块新的符合要求的内存块 ????????????????2、把原内存中的内容拷贝过去 ????????????????3、把原内存块释放并返回新内存块的首地址 ????????????malloc的内存管理机制: ????????????????当首次向malloc申请内存时,malloc会向操作系统申请内存, ????????????????操作系统会直接分配33页(1页?=?4096字节)内存交给malloc管理, ????????????????但是不意味着可以越界访问,因为malloc会把使用权分配给"别人", ????????????????此时就会产生脏数据 ????????????????每个内存块之间一定会有一些间隙(12~4字节),这些空隙一些是为了内存对齐, ????????????????其中一定有4个字记录malloc的维护信息,这些维护信息决定了下次分配内存的位置, ????????????????还可以借助这些位置计算出每个内存块的大小,如果这些维护信息被破坏就会影响下一次的malloc、free函数的调用 ????使用堆内存需要注意的问题: ????????内存泄漏: ????????????内存无法再使用,又无法释放,而再次使用时只能重新申请,然后重复以上过程, ????????????日积月累后系统中可用的内存就会越来越少 ????????????注意:?程序一旦结束属于它的所有资源都会被操作系统回收 ???????????????? ????????????如何避免内存泄漏: ????????????????谁申请,谁释放 ????????????????谁知道该释放谁释放 ????????????如何定位内存泄漏: ????????????????1、查看内存的使用情况 ????????????????????(win?任务管理器?????Linux?ps?-aux) ????????????????2、分析代码、分析代码的工具检查malloc的调用情况 ????????????????3、封装malloc、free,记录申请、释放的信息到日志中 ???????? ????????内存碎片: ????????????已经释放但也无法继续使用的内存叫做内存碎片,是由于申请和释放的时间不协调导致的, ????????????是无法避免的只能尽量减少 ????????????如何尽量减少内存碎片: ????????????????1、尽量使用栈内存 ????????????????2、不要频繁申请和释放内存 ????????????????3、尽量申请大块的内存自己管理 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/28 12:07:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |