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

指针(一)

深入理解指针

  1. const修饰指针

const:表示被修饰的变量具有常量属性;const就是常量的意思

1)当我们创建一个变量,例如变量a,创建后我们可以通过二次赋值,改变它的值。如图所示:

但我们使用const修饰它的一个变量的时候,这个变量就具有了常量属性(在C语言中),常量不可修改,如图所示:

1.2const 修饰指针变量

首先在切入正题前,我们必须理解上面是*p和p。

*p:表示的是指针指向的值

p:表示指针的指向

  1. 、const 类型* 变量名

const在最左边的时候表示修饰指针所指向的值,不可改变所修饰的内容,但是可以改变指针变量的指向。如图所示:

图中const修饰了指针变量int* p所指向的值,使其具有常量属性(常量属性 != 常量),所以不可以修改。

但是我们依然可以修改它的指向。如图所示:

  1. 、类型* const 变量名

const在右边的时候表示修饰指针变量的指向,不可改变指针的指向,但是可以改变指针变量所指向的内容。如图所示:

因为const修饰的是指针变量的指向,所以已经不可改变,但可以改变其指向的内容,如图所示:

3)、const 类型* const 变量名

顾名思义,const既修饰了指针变量指向的内容,也修饰了指针变量的指向,都不可以修改。如图所示:

  1. 野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),如图所示:

在创建局部变量时,如果局部变量的值未初始化,则值将会是随机的(全局变量未初始化,则默认为0),同理,指针变量未初始化则值将会是随机的(具有不确定性和高风险性,不安全性)。

2.1野指针成因

2.1.1、未初始化

2.1.2、越界访问

2.1.3、指针指向的空间释放

在test()函数中,局部变量n,在出函数时被销毁,故变为野指针

  1. assert断⾔

assert.h头⽂件定义了宏assert(),⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为“断⾔”。assert(p !=NULL);

1上⾯代码在程序运⾏到这⼀⾏语句时,验证变量p是否等于NULL。如果确实不等于NULL,程序 继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。assert()宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零),assert()不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零),assert()就会报错,在标准错误流stderr中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

assert()的使⽤对程序员是⾮常友好的,使⽤assert()有⼏个好处:它不仅能⾃动标识⽂件和

出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭assert()的机制。如果已经确认程序没有问

题,不需要再做断⾔,就在#include <assert.h>语句的前⾯,定义⼀个宏NDEBUG

4.指针的使⽤和传址调⽤

传值调用:函数会创建一个新的空间,形参的改变不会影响到实参。

我们发现在main函数内部,创建了a和b,a的地址是0x008b01b9f754,b的地址是0x008b01b9f744,在调⽤ Swap函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是 x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y确实接收到了a和b的值,不过x的地址和a的地址不 ⼀样,y的地址和b的地址不⼀样,相当于x和y是独⽴的空间,那么在Swap1函数内部交换x和y的值, ⾃然不会影响a和b,当Swap函数调⽤结束后回到main函数,a和b的没法交换。Swap函数在使⽤ 的时候,是把变量本⾝直接传递给了函数,这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫传值调⽤。

结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。 所以Swap是失败的了。

我们现在要解决的就是当调⽤Swap函数的时候,Swap函数内部操作的就是main函数中的a和b,直接 将a和b的值交换了。那么就可以使⽤指针了,在main函数中将a和b的地址传递给Swap函数,Swap 函数⾥边通过地址间接的操作main函数中的a和b,并达到交换的效果就好了。

我们可以看到实现成Swap的⽅式,顺利完成了任务,这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数,这种函数调⽤⽅式叫:传址调⽤。

传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值,就需要传址调⽤。

http://www.jsqmd.com/news/867922/

相关文章:

  • 推荐1款提升办公效率神器,文件(夹)批量重命名工具
  • Servlet 表单数据处理指南
  • 独立开发者如何利用Taotoken一站式解决模型选型与接入难题
  • 超低功耗语音识别加速器:SNN与硬件协同设计
  • 从技术实现角度聊聊全屋定制:一套柜子的品质由哪些底层因素决定
  • 2026年近期青少年自行车厂家综合实力评估与联系指南 - 2026年企业推荐榜
  • 《PHP 测验》
  • 大模型提示词压缩技术全景:五大类方法解析与应用指南
  • 20251910 2025-2026-2 《网络攻防实践》第8次作业
  • 大模型推理平台优选推荐榜单——白菜大模型推理平台深度评测与选型指南
  • 2026 年 GPT-5.5 技术架构与模型分层定价:mini 与 nano 版本的取舍逻辑
  • Cortex-M7 AXI接口设计与性能优化指南
  • MMU初始化与预测执行:避免系统崩溃的关键细节
  • 受众洞察 vs 传统市场调研:2026 年决策者指南
  • 沙伯基础创新塑料:高性能工程材料解决方案解析
  • OpenAI 与 Anthropic 财务大比拼:一家亏损求上市,一家盈利逆袭在望!
  • 剪映草稿批量导出工具使用分享,剪映导出还在一条一条点?教你用批处理告别重复操作
  • AXI协议中地址与数据顺序问题解析
  • 实测!朱自清散文AI率超60%?2026年AIGC检测技术局限与降痕方案全解析
  • JavaWeb从0到1-DAY10-JDBC
  • 2026现阶段福建水果配送热门公司深度解析:雅意农产(泉州)有限公司综合实力评估 - 2026年企业推荐榜
  • 【棉花病害诊断】深度学习支持的多模态自动化棉花病害诊断助手【含GUI Matlab源码 15548期】
  • elec-ops-prediction:电力负荷预测算子开发完全指南
  • Gemini 好不好用?2026 真实测评
  • Pacemaker + PostgreSQL 16 + 仲裁模式高可用集群部署指南
  • 跨网段耦合器节省近万元设备更换成本让老旧SmartIE触摸屏重获新生
  • AI大模型在哲学史表述中的系统性西方中心主义偏差——以“人类哲学之父”叙事为例的批判性分析
  • 山东甲亢专治医院哪个好
  • 京东评论拿到数据后对比同款竞品评论,看别家优势短板,找自身差异化卖点
  • 2026最新油管视频下载教程:支持批量解析+4K/8K超清画质