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

news2024/11/15 10:23:50

本节学习内容

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业家必看的十种让利的商业模式解析!

在当今的商业领域,众多创业者正面临前所未有的挑战。市场竞争激烈,价格战频繁,吸引投资者和推广产品都变得异常艰难。然而,问题的关键在于对“人心”的洞察。人们天生追求利益,因此,掌握如何点燃市场需求和…

运维有必要学编程吗?应该学哪种编程语言?

在以往的观念中,运维的工作内容是不涉及编程、开发的,因此以前也没用学编程的需求。然而随着互联网的发展和变化,现如今,运维也需要开始接触开发,接触编程了。 当然有很多运维朋友,本身是不认可的。可&…

IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了)。

文章目录 前言一、链接服务器vscode和pycharm的对比1、pycharm2、vscode3、总结 二、VS Code的安装与下载三、链接远程服务器1、安装远程插件:Remote-SSH2、写ssh配置文件3、链接服务器4、登录成功,打开文件夹 前言 大模型开发肯定要在服务器了&#xff…

使用PyTorch AlexNet预训练模型对新数据集进行训练及预测

在 https://blog.csdn.net/fengbingchun/article/details/112709281 中介绍了AlexNet网络,这里使用PyTorch中提供的AlexNet预训练模型对新数据集进行训练,然后使用生成的模型进行预测。主要包括三部分:新数据集自动拆分、训练、预测 1.新数据…

C++竞赛初阶L1-14-第六单元-数组(31~33课)543: T456473 年龄与疾病

题目内容 某医院进行一项研究,想知道某项疾病是否与年龄有关。因此对以往的诊断记录进行整理,统计 0-18 、 19-35 、 36-60、 61 及以上这四个年龄段的患者人数占总患者人数的比例。 输入格式 输入共 2 行。 第一行包含一个整数 N(0<n≤100),表示总患者人数。 第二…

OpenCV绘图函数(1)绘制带箭头的直线函数arrowedLine()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个从第一个点指向第二个点的箭头线段。 cv::arrowedLine 函数在图像中绘制一个从 pt1 到 pt2 的箭头。另见 line 函数。 函数原型 void c…

Android Auto推出全新Google助手设计

智能手机与汽车的无缝整合已成为现代驾驶的重要组成部分&#xff0c;而 Android Auto 一直在这一领域处于领先地位。谷歌通过不断推出新功能和更新&#xff0c;体现了其致力于提升 Android Auto 体验的决心。最近&#xff0c;Android Auto 引入了 Google助手的全新设计。 当系…

vue3 使用vue-masonry加载更多,重新渲染

在使用 van-list做上拉加载更多&#xff0c;加载下一页的时候&#xff0c;会出现瀑布图重叠&#xff0c;原因是布局没有重新更新&#xff0c;所以需要 调用 vue-masonry更新布局的方法。 看了源码才知道可以这样用&#xff0c;api都没写&#xff0c;隐藏太深了。。。 vue3中通…

随心笔记--测试报告

项目名称 随心笔记 版本号 / 发布类型 正式发布 测试负责人 ** 测试完成日期 2024.8. 联系方式 130576**** 评审人 批准人 评审日期 批准日期 1.项目背景 设计“随心笔记”这个项目的初衷是为了提供一个便捷、个性化的博客管理平台&#xff0c;满足用户记录生…

yarn vite脚手架 react+ts搭建项目

创建react 1、确保你已经安装了Node.js&#xff08;建议使用最新的LTS版本&#xff09;。 2、安装Yarn&#xff08;如果尚未安装&#xff09;: npm install -g yarn 3、创建新项目: yarn create vite 根据提示安装 vite脚手架&#xff0c;如果已安装无提示信息 直接填写项目名…

人脸表情识别数据集分享(内含处理过的AffectNet等数据集)

前言&#xff1a; 人脸表情识别有三大主流数据集rafdb、affectnet、ferplus&#xff0c;之前跑rafdb精度挺正常的&#xff0c;但是另外两个数据集复现不出来精度&#xff0c;经过几个月的踩坑&#xff0c;我发现其实是数据集的原因。 我在官方找的AffectNet数据集有几十个G&…

SQL 高阶 (sql优化)

批量插入&#xff1a; sql 批量插入&#xff1a; INSERT INTO users(name, age) VALUES (Tom, 20), (Jerry, 22), (Bob, 19); -- 该方式 适合 500条以内。多线程插入批量插入&#xff0c;能够大幅提升插入速度。 经过测试&#xff1a;系统性能&#xff0c;8核16G 插入10w条数…

Leetcode 1108. IP地址无效化 C++实现

Leetcode 1108. IP 地址无效化 问题&#xff1a;给你一个有效的 IPv4 地址address&#xff0c;返回这个 IP 地址的无效化版本。 所谓无效化 IP 地址&#xff0c;其实就是用 "[.]" 代替了每个 "."。 方法1&#xff1a;对字符串挨个进行判断&#xff0c;如…

java程序优化

Java程序的性能优化是一个复杂但非常重要的过程&#xff0c;它涉及多个方面。首先&#xff0c;我们需要识别性能瓶颈的具体位置&#xff0c;这通常可以通过性能分析工具&#xff08;如JProfiler, VisualVM等&#xff09;来完成。以下是一些通用的优化策略&#xff1a; 代码层面…

进程的创建与使用(win32-API)

一、前言 进程可以被视作操作系统中运行程序的一个实例&#xff0c;是系统资源分配和调度的基本单位。每一个进程都拥有自己独立的地址空间、一组状态信息&#xff08;如打开的文件、内存映射等&#xff09;&#xff0c;以及一个或多个线程来执行代码。进程之间的隔离性确保了…

飞睿智能家居人体微动感知雷达模组,宠物喂食器、LED灯控连续波雷达感应开关原理

在智能家居的浪潮中&#xff0c;飞睿智能人体微动感知雷达模组犹如一位“隐形守护者”&#xff0c;以其独特的连续波雷达感应开关原理&#xff0c;为我们带来更为智能、便捷的生活体验。今天&#xff0c;就让我们一起走进这一前沿科技&#xff0c;探索它是如何改变我们的生活。…

IOS 13 网络请求和Moya框架

允许HTTP请求 从iOS9开始&#xff0c;推荐使用HTTPS&#xff0c;如果使用的HTTP&#xff0c;默认情况下会出现如下错误&#xff1a; The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. 这是因为iOS9引…

中俄联袂 助力前行 点燃希望——助残义诊在杭州邦尔骨科医院顺利举行

8月26日&#xff0c;由杭州市残疾人联合会主办、临平区残疾人联合会承办&#xff0c;杭州市邦尔骨科医院协办的“中俄联袂 助力前行 点燃希望”助残义诊活动在该院1号楼门诊大厅顺利进行。此次活动得到了俄罗斯伊里扎洛夫中心医院和杭州市邦尔骨科医院专家的大力支持。 本次义诊…

珈创生物业绩下滑:毛利率连年大降,产能利用率滑坡仍募资扩产

《港湾商业观察》廖紫雯 日前&#xff0c;武汉珈创生物技术股份有限公司&#xff08;以下简称&#xff1a;珈创生物&#xff09;于北交所证券交易中心披露招股书&#xff0c;保荐机构为国投证券。 珈创生物往年IPO进程可谓一波三折。2020年12月&#xff0c;公司曾申报沪交所科…

双向NAT应用场景和配置

域内双向NAT&#xff08;端口回流&#xff09; 局域网内有一台或多台服务器可能需要对外映射提供服务&#xff0c;如内网终端也需要访问&#xff0c;这时如终端通过映射后的公网地址访问会出现无法访问的情况&#xff0c;这时就需要域内双向NAT&#xff08;华三很多路由器会有…