当前位置: 首页 > article >正文

指针的概念及应用

一.指针的概念本质上指针是一个变量他的值不是数据而是另一个变量在内存的地址。*解引用运算符取地址运算符-结构体/联合体指针成员访问符;[ ]:下标运算符.:直接成员访问符二.指针的算术运算指针加法对指针进行加法运算时指针会移动到它所指类型的下一个元素。int arr[5]{1,2,3,4,5}; int *parr; p;\\p指向arr[1];即arr[1]减法同理只不过时向前移动sizeofint个字节。三.指针常量和常量指针常量指针指针常量语法const int*p或int const* pint *const p指向的值不能通过*p修改可以修改指针的指向可以指向其他变量初始化后不能指向其他地址典型用途防止函数修改数据固定指针指向的地址四.为什么函数参数常用const修饰1.防止意外修改const 可以保证参数在函数内部不会被修改。特别是对于指针参数能避免了意外改变原始数据。2.明确函数意图看到 const 参数能立刻明白这个参数是只读的。这降低了沟通和理解的成本。3.允许传入常量或字面量如果参数没有 const 修饰函数就可能被设计成“可修改”的导致无法安全地传入字符串字面量或 const 变量。4.编译器可做优化const 向编译器提供了额外的信息不必担心内存被更改从而生成更高效的代码。常量指针常量const int *const p既不会修改常量也不会改变指针指向的地址。指针数组和数组指针指针数组本质是数组数组里的元素均为指针数组指针本质是指针指针指向一个数组。指针数组数组指针声明语法类型 *数组名[长度]类型*指针名[长度]内存布局连续存储多个指针变量只存储一个地址指向某数组的首地址占用空间sizeof指针大小*元素数量sizeof指针本身的大小常见用途存储多个字符串处理多行文本指向二维数组的行在函数见传递多维数组元素访问通过下标访问指针arr[i]得到指针*arr[i]得到h值先解引用得到数组再下标*ptr[i]或ptr[0][i]与二维数组的关系动态的“锯齿状”二维数组指向固定的二维数组五.1.数组名退化大多数情况下数组名会被转换为其首元素的指针。退化的类型结果指向元素类型的指针。退化后的值数组首地址元素的地址即arr[0]。2.什么场景会发生退化1.作为函数参数赋值给指针参与算术运算用*解引用用[]下标。3.不退化的特殊场景有哪些sizeof数组名数组名字符串字面量初始化数组。六.指针函数和函数指针指针函数本质是函数其返回值是指针函数指针本质是指针变量存储函数的入口。函数指针指针函数声明语法类型 *函数名(参数列表)类型 *指针名参数列表重点强调函数返回什么类型的指针强调指针指向声明类型的函数占用空间代码占代码段空间指针本身占sizeof字节常见用途返回动态分配的内存地址返回数组或字符串的首地址返回结构体指针回调函数函数作为参数传递实现跳转表或状态机调用直接调用int *resultfunc(1,2);先赋值pfunc;或pfunc;在调用:(*p)(1,2);或p(1,2);七.二级指针一级指针int *p存储变量的地址二级指针(int **p)存储以及指针的地址。1.主要用途1.函数内修改指针本身如果想在函数中改变指针的指向必须传入二级指针。否则形参是实参的拷贝函数内改变不了外部的指针。2.动态二维数组创建行列可变的二维数组时常见做法是先分配指针数组再给每个指针分配一行。3.指针数组的操作遍历、排序字符串数组时往往使用二级指针遍历修改数组元素的顺序只需交换指针效率更高。4.链表头结点快速修改在链表插入、删除时使用二级指针可以简洁地处理头部变化不必分情况讨论。5.给指针返回值传递信息某些函数需要返回错误码同时又要输出指针结果此时错误码做返回值指针结果用二级指针传出。八.野指针野指针是指指向未知、无效或随机内存地址的指针。野指针和空指针NULL明确指向地址0不同野指针指向的地址是不可预测的。成因1.指针未初始化当指针声明时未赋予初始量他会赋予一个随机的内存地址直接使用未初始化的指针可能会访问到不合法的内存区域造成不可预计的后果。int *ptr; //未初始化的指针指向随机地址 *ptr10;2.指向的内存已被释放当指针指向的内存被释放时该指针依然保留了原来的地址该地址就不再有效指针也成为野指针如果再次访问该地址会造成不可语句的后果。int *ptr(int *)malloc(sizeof(int)); *ptr10; free(ptr); //释放了指针指向的内存 *ptr20;3.指针越界指针指向了合法分配的内存块但通过算术运算跑到了该内存块的外部。虽然地址在进程空间内但该地址不属于当前数组/对象访问它是非法的。int arr[5]; int *parr; pp10; //超出数组的内存范围 *p10000; //可能覆盖其他变量产生难以追踪的bug规避方法1.初始化时置为 NULL定义指针时可以先赋值为 NULL。使用前可使用 if (p ! NULL)检查。2.释放内存后立即置 NULLfree(p) 后野指针仍保留原地址必须手动 p NULL;。3.避免返回局部变量的地址函数内的局部变量在函数返回后已销毁不要返回其地址。4.注意指针作用域尽量缩小指针作用域或在嵌套块中使用完及时处理。5.使用静态/动态分析工具如 valgrind、编译器的 -Wall -Wextra 警告选项或 Address SanitizerASan。

相关文章:

指针的概念及应用

一.指针的概念:本质上指针是一个变量,他的值不是数据,而是另一个变量在内存的地址。*:解引用运算符;&:取地址运算符;->:结构体/联合体指针成员访问符;[ ]:下标运算符&#xf…...

2026届毕业生推荐的六大AI辅助写作神器横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作范围内,针对紧迫的截止时间以及繁重的文献整理任务,研究人…...

形态计算与软体机器人的生物启发原理及应用

1. 形态计算与软体机器人的生物启发原理形态计算(Morphological Computation)的核心思想是将计算任务"卸载"到物理结构本身。这个概念最早由Pfeifer和Iida在2005年提出,他们观察到生物系统(如章鱼触手)通过形…...

从验证到FPGA原型:手把手教你用CK_RISCV平台玩转RISC-V处理器全流程

从验证到FPGA原型:手把手教你用CK_RISCV平台玩转RISC-V处理器全流程 在当今开源处理器架构的浪潮中,RISC-V凭借其模块化设计和开放生态迅速崛起。对于希望深入理解处理器设计全流程的工程师而言,从RTL代码到硬件原型的完整闭环实践是至关重要…...

避坑指南:SpringBoot集成HAPI处理HL7消息时,你可能会遇到的编码与ACK回复问题

SpringBoot集成HAPI处理HL7消息的实战避坑指南 医疗系统间的数据交换往往采用HL7协议标准,而HAPI作为Java生态中最成熟的HL7处理框架,与SpringBoot的结合能快速构建稳定服务。但在实际联调中,开发者常会遇到字符集混乱、ACK响应不规范等"…...

real-anime-z镜像免配置:CSDN平台开箱即用,省去Diffusers环境搭建

real-anime-z镜像免配置:CSDN平台开箱即用,省去Diffusers环境搭建 1. 镜像介绍与核心优势 real-anime-z是CSDN星图平台提供的专业动漫风格文生图镜像,专为二次元创作场景优化。这个镜像最大的特点就是开箱即用,用户无需配置复杂…...

别再全网乱搜了!手把手教你用康耐视VisionPro搞定工业视觉标定(附避坑指南)

工业视觉标定实战:康耐视VisionPro从入门到精通的完整指南 第一次打开康耐视VisionPro时,相信很多工程师都会有种"面对外星科技"的错觉——密密麻麻的工具按钮、晦涩难懂的参数设置、复杂的标定流程...这就像给你一把瑞士军刀却不知道从哪个工…...

AMD Ryzen 处理器终极调校指南:RyzenAdj 完全掌控你的硬件性能

AMD Ryzen 处理器终极调校指南:RyzenAdj 完全掌控你的硬件性能 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj RyzenAdj 是一款开源工具,专为 AMD Ryzen 移动…...

思源宋体CN终极指南:7款免费开源中文字体快速上手教程

思源宋体CN终极指南:7款免费开源中文字体快速上手教程 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 思源宋体CN(Source Han Serif CN)是Google与A…...

QKeyMapper终极指南:3分钟掌握Windows游戏手柄与键盘映射神器

QKeyMapper终极指南:3分钟掌握Windows游戏手柄与键盘映射神器 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止。支持游戏手柄映射到键鼠&…...

深入解析KMS_VL_ALL_AIO:Windows与Office智能激活完整指南

深入解析KMS_VL_ALL_AIO:Windows与Office智能激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows系统和Office办公软件的激活领域,KMS_VL_ALL_AIO智能…...

如何快速解包Godot游戏资源:终极PCK文件提取工具指南

如何快速解包Godot游戏资源:终极PCK文件提取工具指南 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 如果你正在寻找一个高效、免费的Godot游戏资源解包工具,那么godot-unpac…...

agent智能体应用设计

Agent智能体系统作为人工智能技术的重要发展方向,正从概念验证阶段快速迈向产业应用。随着大语言模型(LLMs)能力的不断提升,Agent架构正突破传统聊天机器人的局限,通过感知-思考-行动-学习(STAL)闭环,实现从"能说"到"能办"的质变。本文系统梳理Age…...

热敏电阻模块的AO模拟输出怎么用?STM32的ADC采集与温度曲线拟合实战

热敏电阻模块的AO模拟输出与STM32高级温度监测系统开发指南 1. 从开关量到模拟量:热敏电阻模块的进阶应用 许多开发者初次接触热敏电阻模块时,往往只使用其数字输出(DO)功能实现简单的温度阈值报警。这种"非黑即白"的检测方式虽然简单易用&…...

别再乱用shutdown了!Java线程池优雅关闭的3种实战场景与避坑指南

Java线程池优雅关闭实战:3大场景避坑指南 线程池作为Java并发编程的核心组件,其关闭过程看似简单却暗藏玄机。许多开发者习惯性调用shutdown()便以为万事大吉,直到线上出现任务丢失、数据不一致等问题才追悔莫及。本文将深入Web服务、定时任务…...

PCA人脸识别算法研究

PCA(主成分分析)人脸识别是一种基于统计学习的降维方法,由Matthew Turk和Alex Pentland于1991年首次系统提出并应用于人脸识别任务。这种方法通过将高维人脸图像数据映射到低维"特征脸"(Eigenfaces)子空间,显著降低了计算复杂度,同时保留了数据中的主要判别信…...

Excel数据分析师必看:从入门到精通Power Pivot的5个核心DAX函数实战(含CALCULATE、RELATED避坑指南)

Excel数据分析师进阶指南:5个核心DAX函数实战精解与避坑手册 当你第一次在Power Pivot中看到DAX公式时,可能会被它看似简单的语法迷惑——直到你尝试构建第一个复杂计算指标。与Excel函数不同,DAX的真正威力隐藏在筛选上下文这个核心概念中。…...

保姆级教程:在AOSP源码里给SIM卡加个“小功能”,从UiccProfile到IccRecords的客制化实战

深度定制AOSP Telephony框架:从UiccProfile到IccRecords的SIM卡功能扩展实战 在Android系统开发领域,Telephony框架的定制化需求日益增多,尤其是针对SIM卡功能的深度改造。本文将带您深入AOSP源码,探索如何在UiccProfile、IccReco…...

别再死记公式了!用Python+Matplotlib动画可视化理解向量点积、叉积的几何意义

用Python动画解锁向量运算的几何奥秘:点积与叉积的视觉化探索 线性代数中那些抽象的向量运算公式,是否总让你在纸上反复推导却难以建立直观理解?当教科书上冰冷的数学符号无法唤起你的几何直觉时,或许该让代码和动画来架起这座桥梁…...

终极罗技PUBG鼠标宏教程:5分钟掌握智能压枪技巧

终极罗技PUBG鼠标宏教程:5分钟掌握智能压枪技巧 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 绝地求生(PUBG&#xff0…...

联楷国际超级大掌柜:商业AI大模型如何重塑中小企业智能管理未来?

在人工智能浪潮席卷全球的当下,商业领域的AI应用已从概念炒作转向深度落地。对于广大中小企业而言,如何选择一家非娱乐化AI公司,真正将AI技术转化为降本增效的利器,成为数字化转型的关键命题。作为科大讯飞生态伙伴,联…...

告别绿点焦虑!用ADB命令一键隐藏Android 12/13的相机麦克风状态栏图标(无需Root)

深度隐藏Android隐私指示器的ADB高阶玩法 每次打开相机或语音助手时,状态栏角落那个闪烁的绿点总在提醒你:系统正在监视着你的隐私权限。对于注重界面简洁的极客用户来说,这个设计良好的隐私保护功能反而成了视觉干扰。更令人困扰的是&#…...

实战踩坑记录:在Windows 11上用Android Studio模拟器跑通Android Maxim的全过程

Windows 11环境下的Android Maxim实战:从环境搭建到自动化测试全解析 在移动应用开发领域,自动化测试已成为保证产品质量的关键环节。对于Windows平台上的Android开发者而言,如何在本地环境中高效运行自动化测试工具,是提升开发效…...

从Depix的爆火到冷静:聊聊‘马赛克还原’背后的算法原理与伦理边界

从Depix的爆火到冷静:解码马赛克还原技术的双面性 当Depix项目在GitHub上突然走红时,整个技术社区为之震动。这个看似简单的工具,能够将某些特定类型的马赛克还原为原始文字,引发了关于数字隐私安全的广泛讨论。但在这股热潮背后&…...

为什么高频PLL里偏爱用TSPC分频器?聊聊动态触发器的那些事儿

为什么高频PLL设计者钟爱TSPC分频器?动态触发器的技术内幕 在5G通信和毫米波雷达的电路设计中,工程师们常常面临一个关键抉择:当锁相环(PLL)需要工作在10GHz以上频率时,传统分频器架构突然变得力不从心。此…...

本地部署应用服务器 Wildfly 并实现外部访问

wildfly 是一款高性能、可扩展的易于管理的开源应用服务器。它支持独立模式和域模式,适应不同规模需求,支持大规模并发连接,使用社交网络、在线游戏等场景。本文将详细介绍如何在本地安装 Wildfly 以及结合路由侠内网穿透实现外网访问 Wildfl…...

从零到一:在Ubuntu上为SpaceMouse配置开源驱动并集成Python/Robosuite

1. 为什么需要为SpaceMouse配置开源驱动? 如果你手头有一台3Dconnexion的SpaceMouse,想在Ubuntu系统上使用它来控制机器人仿真环境,可能会遇到一个尴尬的问题:官方早在2014年就停止了对Linux驱动的支持。这意味着你无法直接使用Sp…...

MAX30102心率血氧数据不准?可能是你的算法和滤波没做对(STM32实战分析)

MAX30102心率血氧测量优化实战:从数据波动到精准结果的进阶指南 引言:当传感器数据开始"说谎" 那是一个加班的深夜,我的MAX30102模块第37次显示我的心率为0——而我的咖啡杯知道这显然不真实。这种令人抓狂的场景,正是许…...

告别复制粘贴!实战派教你用Allegro2Altium.bat脚本搞定AD文件转换(附环境变量避坑指南)

告别复制粘贴!实战派教你用Allegro2Altium.bat脚本搞定AD文件转换(附环境变量避坑指南) 在PCB设计领域,文件格式转换一直是工程师们绕不开的痛点。特别是当项目需要从Cadence Allegro迁移到Altium Designer时,网上的教…...

ESP8266连接公共MQTT服务器,用户名密码怎么填才不报错?

ESP8266连接公共MQTT服务器的认证避坑指南 当你在深夜调试ESP8266连接MQTT服务器时,突然弹出一条"Connection failed: Bad username or password"的错误提示——这种挫败感每个物联网开发者都经历过。本文将带你深入理解公共MQTT服务器的认证机制&#xf…...