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

相关文章

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O