C语言重难点总结(2)-指针操纵与布局体、动态内存

[复制链接]
发表于 2026-2-1 04:24:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本节学习内容
1.指针操纵与布局体
2.函数(递归函数)
3.动态内存
一、指针操纵与布局体
指针可以作为布局体的内部成员使用,也可以使用布局体指针操纵布局体空间。
二、函数
1.指针函数
(1)什么是指针函数?
指针函数本质是一个函数,该函数的反回值是一个指针。
比方·:int* p(int x,int y);
2.函数指针
函数指针是指向函数的指针。
比方:
int add(int x,int y);
int max(int x,int y);
int (*fun)(int add,int max);//函数指针


3.递归函数
1.分治战略: 是将规模比力大的标题可分割成规模较小的雷同标题。标题稳固, 规模变小。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法筹划之中, 并由此产生许多高效算法。
递归: 若一个函数直接地或间接地调用自己,则称这个函数是递归的函数。(简朴地形貌为“自己调用自己”) 。
2.分治法所能办理的标题一样寻常具有以下四个特性:
1) 该标题的规模缩小到肯定的水平就可以轻易地办理。
2) 该标题可以分解为多少个规模较小的雷同标题。
3) 使用小规模的解,可以归并成, 该标题原规模的解。
4) 该标题所分解出的各个子规模是相互独立的。
3.分治法步调:
在分治战略中递归地求解一个标题, 在每层递归中应用如下三个步调:
分解: 将标题分别成一些子标题, 子标题的情势与原标题一样, 只是规模更小。
办理: 递归地求解子标题。如果子标题的规模充足小, 则制止递归, 直接求解。
归并: 将小规模的解组合成原规模标题的解。
如下,递归实现快速排序


 

三、动态内存
1.动态内存开发在哪个地域?
堆区
2.堆区与栈区的区别
(1)巨细
栈约1M(体系管理内存)

堆区内存windows中 约1.5G~1.9G    linux中约2.9G(步伐员管理)

(2)内存分配方向

栈内存开发:高地点—>低地点

堆内内存开发:低地点->高地点
(3)管理方式

栈:体系管理内存

堆:步伐员管理

3.动态内存的开发(malloc) 

头文件:stdlib.h

申请内存时内存前会申请一个指针头生存申请内存的巨细
比方:int* p=(int*)malloc(10*sizeof(int));

动态内存申请后要判断是否申请乐成

assert(p!=NULL);

4.动态内存扩容(realloc)

比方:对上方申请的动态内存举行2倍扩容

int* q=(int*)realloc(p,2*(10sizeof(int)));

扩容乐成后要判断是否申请乐成

assert(q!=NULL);

6.动态内存的开释

比方:free(p);

由于指针头的存在以是开释动态内存时会知道开释的巨细

7.malloc与calloc的区别

   malloc申请的空间开始存放的是随机值
   calloc申请的空间存放的为范例默认值0(相当于初始化)

8.free出现瓦解的缘故原由有哪些?

1)同一块内存多次开释  会瓦解

办理:方法使 p=NULL

2)free(指针)开释的指向必须是malloc申请的出发点地点  否则会瓦解

3)开释的优劣堆区空间内存  会瓦解

8.free怎样知道它要开释巨细?

通过指针头(内存储申请内存的巨细空间)来判断

9.扩容的三种环境

扩容环境1:如果mallock申请的内存后有充足的空间那么就直接反面举行扩容

扩容环境2:如果后空间不敷就会额外别的开一块大空间,将原始空间的数据拷贝到新空间当中并举行原空间的开释,返回新空间的地点。

扩容环境3:如果扩容空间 > 剩余最大空间则扩容失败 return NULL


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表