news 2026/5/23 1:29:08

指针(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
指针(一)

深入理解指针

  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函数的时候是将变量的地址传递给了函数,这种函数调⽤⽅式叫:传址调⽤。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 1:26:01

gd32f303烧录提示Flash Timeout. Reset the Target and try it again.;

出现这个原因&#xff0c;是因为我在代码中使用了&#xff1a; ob_security_protection_config(FMC_USPC); // 开启保护 保护装置&#xff0c;导致烧录的时候出现 Flash Timeout. Reset the Target and try it again.&#xff1b; Error: Flash Download failed - "Cort…

作者头像 李华
网站建设 2026/5/23 1:17:15

第16届华城船游节5月22日起航

华城市文化观光财团宣布&#xff0c;韩国著名的海洋文化庆典第16届华城船游节将于5月22日至25日在前谷港一带举行&#xff0c;为期四天。 华城船游节是韩国的官方文化观光庆典之一&#xff0c;今年的庆典升级为融合海上休闲体验与顶级文化表演的沉浸式庆典&#xff0c;看点更…

作者头像 李华
网站建设 2026/5/23 1:16:40

ATC 做了什么:从 ONNX 到 .om

前言 训练好的模型&#xff0c;怎么跑到昇腾 NPU 上&#xff1f; 答案是 ATC&#xff08;Ascend Tensor Compiler&#xff09;。它做的事情很直接&#xff1a;把一个框架导出的模型文件&#xff08;通常是 ONNX 格式&#xff09;&#xff0c;编译成昇腾 NPU 可以直接执行的 .om…

作者头像 李华
网站建设 2026/5/23 1:14:24

工业云脑:01 IIoT是谁?从4G到5G+边缘计算

01 IIoT是谁?从4G到5G+边缘计算 上回序章说数据飞云端、工厂有了新大脑,今天就直奔主题——IIoT是谁?从4G到5G+边缘计算。别以为IIoT是啥外星科技,它就是咱们车间里“老熟人”物联网的工业版:把传感器、PLC、机器臂、摄像头全连上网,让数据不再在厂里打转转,而是嗖嗖飞…

作者头像 李华
网站建设 2026/5/23 1:09:13

迭代型量子算法的密码学应用【附算法】

✨ 长期致力于量子差分攻击、量子密文搜索、量子同态计算、具有记忆的量子行走、量子哈希函数研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;量子极值…

作者头像 李华
网站建设 2026/5/23 1:07:09

OpenClaw 数据采集工具新手入门指南

在数据驱动的开发工作中&#xff0c;我们经常面临这样一个痛点&#xff1a;需要从多个网页中定期提取特定信息&#xff0c;比如监控产品价格变动、收集行业新闻或者聚合技术文档。手动复制粘贴不仅效率低下&#xff0c;而且容易出错&#xff0c;一旦源页面结构微调&#xff0c;…

作者头像 李华