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

本节学习内容

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

相关推荐
汽车电子助手9 分钟前
如何制作Vector Vflash中加载的DLL文件--自动解锁刷写过程中27服务
开发语言·单片机·嵌入式硬件
码农不惑15 分钟前
如何在C++中使用mupdf操作pdf文件(一)
开发语言·c++·pdf
liangshanbo121515 分钟前
JavaScript:页面可见性API
开发语言·前端·javascript
码农超哥同学17 分钟前
Python知识点:如何使用Python进行日志处理与分析
开发语言·python·面试·编程
怒放的生命.17 分钟前
GUI编程10:窗口监听事件
java·开发语言·前端
一休哥助手24 分钟前
使用 Python 中的 Schedule 模块进行任务调度
linux·开发语言·python
py.鸽鸽24 分钟前
C语言——数组,指针,指针数组,数组指针
c语言·算法
DC102027 分钟前
Java 每日一刊(第6期):整数运算
java·开发语言
Thomas_YXQ1 小时前
Unity3D 实现水体交互详解
开发语言·unity·编辑器·交互·unity3d·游戏开发
maosql1 小时前
arm和riscv系统调用对比(笔记)
c语言·arm开发·笔记·系统调用·上下文切换