IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 22:56:03  更:2021-07-22 22:56:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 20:13:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码