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

2024-08-28 04:52

本文主要是介绍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

这篇关于C语言重难点总结(2)-指针操作与结构体、动态内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113787

相关文章

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个