c语言-指针

初识指针(引入地址的概念)

首先:我们知道,一个变量的四个要素(变量名、变量的数据类型、变量的值、内存地址)。我们平时做的事就是使用变量的名来访问变量的值,也可以通过取地址符&来获取变量的地址,就比如下面这张图:

根据上面的代码展示,我们清晰的知道了怎么从变量中获取它的值(原样输出)和地址,那么思考一个问题:能不能根据变量的地址来获取变量的值?

引入一个运算符:*,星号又叫取值运算符,它就能根据变量的地址获取对应变量的值,如下面这串的代码:

根据地址来访问变量的值,就是指针的操作。没错,指针就是地址,地址就是指针:

举个例子:将指针的概念放到实际生活中的游标卡尺,那个位于尺子下方的那个小三角就是指针,尺子上的刻度就是地址,刻度对应的数字就是变量值

总结:我们既可以根据变量名来获取变量值(直接访问),也可以根据变量的内存地址也就是指针来获取变量的值(简介访问)

指针变量

根据上面我们知道了指针这个概念(指针与地址绑定),那我们再思考一下:平时那些变量都是用来存放数据的,那么有没有一种变量可以存放地址的?

答案是有的,就是指针变量,写法格式:   数据类型  *变量名;所谓指针变量,就是存放别人地址的变量。

那么上面变量的四要素提及了三个(变量名、变量值、便量的内存地址),那么变量的数据类型与指针又有什么练习?

让我们看下面这个例子:

我们编译结果有一个警告:pp指针变量的类型不匹配。但是指针变量p和pp虽然数据类型不同,但继续编译出来的结果没有错,看起来并没有问题,那我们继续往下看:

从这个编译结果看到,明明编译出来的地址是一致的,那为什么访问出来的值并不一致?

我们通过sizeof关键字来获取了char、int和指针变的大小,int占4字节(32位),char占1字节(8位),指针变量占8字节(64位)。(一个字节占8位)

提及一个概念:取值运算符*会根据指针类型来进行取值,int型在内存空间中占4个字节(32位),char占1个字节(8位),而a定义的值是16进制的:因此该值需要16位来进行存储(补充:16进制的数在内存中需要四位来进行存储):示意图:

内存的读取顺序是从右往左,所以取值运算符能完整访问出来int  *p,而char *pp只有八位因此只能访问出34。也就是说,指针变量的数据类型与被存放地址变量的类型不一致时,取值运算符访问取值的时候跨度也是不一样的,因此要求指针变量类型一致。

再接着往下看地址的跨度:

高亮的部分是进行地值自增的操作,可以看到p自增与pp自增之后得到的地址是不一致的。因为p是int类型4个字节(32位),pp是char类型1个字节(8位),(地址也是16进制的),a也是int类型32位,因此刚开始地址都是FE0C,p进行自增后具有增一位补0也就是FE10;pp进行自增就只能是FE0D。

总结:定义指针变量时,类型也要一致,因为它指向内存空间的大小,也决定增量

为什么需要指针变量


知道了指针变量之后,我们来思考为什么需要指针变量?

看下面这个案例:

用函数封装的方式来进行两个值的交换

我们可以看到,实际数据并没有交换成功。可以提及一个概念(形参的生命周期:形参只有在函数被调用时才会被系统临时赋予内存空间,并且他是会有属于自己的内存地址,也就说,尽管形参与实参名字一致,但从地址来说,并不是一个东西,在函数调用结束后形参的内存会被系统回收释放)。

也就是说,实参的值通过值传递(值拷贝)给了形参,并在函数中也确实进行了改变,但是函数调用结束时这个改变的值也跟随着形参被释放而被释放了,因此main中实参的值并没有进行交换,而是原样输出。

你可能想说在函数中将交换过的值直接return回来,但是答案是,返回值不支持多个值

所以这个时候就要用到我们的指针变量:

将实参的内存地址传给形参(存放地址需要指针变量地址,形参得定义成指针变量并且类型一致),在进行交换就可以得到交换后的结果。

为什么指针变量就可以呢?因为指针变量是过地址间接访问实参的值

我们来看一下传递过程:

指针变量接收到值了(也就是main中实参的地址),那么通过取值运算符*就能访问到传过来对应地址的值,也就是说*pdata=10,*pdata2=20,尽管形参最后会被释放,但是因为他操作的就是main中data和data2内存地址其对应的值,所以,最终main中data和data2的值进行了交换。

总结:指针==地址;指针的数据类型要与之一致

下载方式:https://pan.quark.cn/s/a4b39357ea24 在纺织制造领域中,纱线的品质水平对最终制成品的整体质量具有决定性作用。 鉴于消费者对于产品规格和样式要求的不断变化,纺织制造工艺的执行过程日益呈现为一种更为复杂的操作体系,进而导致对纱线质量进行预测的任务变得更加困难。 在众多预测技术中,传统的预测手段在面对多变量间相互交织的复杂关系时,往往显得力不从心。 因此,智能计算技术在预测纱线质量的应用场景中逐渐占据核心地位,其中人工神经网络凭借其卓越的非线性映射特性以及自适应学习机制,成为了众多预测方法中的一种重要选择。 在智能计算技术的范畴内,粒子群优化算法(PSO)和反向传播神经网络(BP神经网络)是两种被广泛采用的技术方案。 粒子群优化算法是一种基于群体智能理念的优化技术,它通过模拟鸟类的群体觅食行为来寻求最优解,该算法因其操作简便、执行高效以及具备优秀的全局搜索性能,在函数优化、神经网络训练等多个领域得到了普遍应用。 反向传播神经网络则是一种由多层节点构成的前馈神经网络,它通过误差反向传播的机制来实现网络权重和阈值的动态调整,从而达成学习与预测的目标。 在实际操作层面,反向传播神经网络因其架构设计简洁、实现过程便捷,因此被广泛部署于各类预测和分类任务之中。 然而,该方法也存在一些固有的局限性,例如容易陷入局部最优状态、网络收敛过程缓慢等问题。 而粒子群优化算法在参与神经网络优化时,能够显著增强神经网络的全局搜索性能并提升收敛速度,有效规避神经网络陷入局部最优的困境。 将粒子群优化算法与反向传播神经网络相结合形成的PSO-BP神经网络,通过运用粒子群优化算法对反向传播神经网络的权值和阈值进行精细化调整,能够在预测纱线断裂强度方面,显著提升预测结果的...
植物实例分割数据集 一、基础信息 数据集名称:植物实例分割数据集 图片数量: - 训练集:9,600张图片 - 验证集:913张图片 - 测试集:455张图片 总计:10,968张图片 分类类别:59个类别,对应数字标签0至58,涵盖多种植物状态或特征。 标注格式:YOLO格式,适用于实例分割任务,包含多边形标注点。 数据格式:图像文件,来源于植物图像数据库,适用于计算机视觉任务。 二、适用场景 • 农业植物监测AI系统开发:数据集支持实例分割任务,帮助构建能够自动识别植物特定区域并分类的AI模型,辅助农业专家进行精准监测和分析。 • 智能农业应用研发:集成至农业管理平台,提供实时植物状态识别功能,为作物健康管理和优化种植提供数据支持。 • 学术研究与农业创新:支持植物科学与人工智能交叉领域的研究,助力发表高水平农业AI论文。 • 农业教育与培训:数据集可用于农业院校或培训机构,作为学生学习植物图像分析和实例分割技术的重要资源。 三、数据集优势 • 精准标注与多样性:标注采用YOLO格式,确保分割区域定位精确;包含59个类别,覆盖多种植物状态,具有高度多样性。 • 数据量丰富:拥有超过10,000张图像,大规模数据支持模型充分学习和泛化。 • 任务适配性强:标注兼容主流深度学习框架(如YOLO、Mask R-CNN等),可直接用于实例分割任务,并可能扩展到目标检测或分类等任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值