编程仙尊——深入理解指针(2)

news2024/9/20 16:43:51

目录

4.const修饰指针

4.1const修饰变量

5.指针运算

5.1指针+-整数

5.2指针-指针

5.3指针的关系运算

6.assert断言



4.const修饰指针

4.1const修饰变量

在编程中,为了防止代码在运行过程中变量的内容意外改变,可以使用const函数,对变量进行限制,使变量处于不可直接被修改的状态。

比如:

a764d960a3274491a8a7c6a586e68dee.png

被const修饰后的b,是无法通过b进行直接修改的,但是如果我们换种方法呢?

b79b5427d4a849668b4a6b55ef200546.png

可以发现,即使通过 b 无法直接实现内容的更改,但如果我们将b的地址取出来,通过地址更改b的内容,还是可以做到的

那如果我们也不想通过地址更改b的内容呢?比如:

5f7a35070fe047678d000866f9362b3a.png

在这里,我们通过const 限制 *pb,就无法通过*pb 更改 pb所指向地址的内容

这里限制的是*pb,但是pb是不受任何影响的,比如:

4cc1b168d5cc43189c8ca1059c57bd29.png

我们仍旧可以使用pb,令 pb = a 的地址,最后解引用pb所指向的地址,输出a的值

注意:这里只是无法通过*pb 更改 pb所指向地址的内容,并不是说明*pb无法使用,比如:

964e0c0540c14f0b9eb4e472002b9731.png

如果我们只想限制 pb ,那就如左图        如果我们 pb 与 *pb 都想限制,那就如右图

0dc4a2f446a54c4ea13b750afcedc118.png7563fe628d624ad0b5abc5a619343dde.png

结论:const修饰指针变量的时候

(1)const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变

(2)const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针所指向的内容,可以通过指针改变


5.指针运算

指针的基本运算有三种,分别是:

指针+-整数

指针-指针

指针的关系运算


5.1指针+-整数

2a547a364a5740cf98ff4973198b03a0.png

备注:数组名代表首元素地址

指针+-整数会跳过 整数*sizeof(类型)个字节,上一张章作品有详细讲解


5.2指针-指针

指针-指针会返回一个整数,返回的这个整数的绝对值是两个地址之间的元素个数

比如:

285406f80b1b42f4abff9f55a2cb397c.png


5.3指针的关系运算

指针之间也是有大小的,因此也可以通过指针来实现循环

3d15155c25fb44119944b1baca161fb0.png


6.assert断言

在C语言中有一种函数,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运动,它也常常被称为“断言”

这个函数就是assert函数

assert( )接受一个表达式作为参数。如果该表达式为真(返回值非零),assert( )不会产生任何作用,程序继续运行。

如果该表达式为假(返回值为零),assert( )就会报错,在标准错误流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

在使用assert函数时,我们要包含一个头文件 <assert.h>

使用如下:

74b4459d38d5407f879f1b4e4141db22.pngf888a15b2a9a49c39109d09a9e7f57c2.png

由此可见assert的作用

当我们写了几百行代码时,assert就可以起到很大的作用,同时assert对于程序员是非常友好的,当我们利用assert确定程序完全没有问题之后,我们就可以在头文件之前定义一个NDEBUG,

这样所有的assert就会被注释掉,提高代码运行效率

当我们出错误时,把NDEBUG去掉,就可以再次使用assert了

92c86f7e153d4471ae039ed9e163401c.png

由此可见,利用完NDEBUG后,a不等于10代码也可以正常进行

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

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

相关文章

介绍python的回归模型原理知识

一.回归 1.什么是回归 回归&#xff08;Regression&#xff09;最早是英国生物统计学家高尔顿和他的学生皮尔逊在研究父母和子女的身高遗传特性时提出的。1855年&#xff0c;他们在《遗传的身高向平均数方向的回归》中这样描述“子女的身高趋向于高于父母的身高的平均值&…

Linux云计算 |【第二阶段】SHELL-DAY2

主要内容&#xff1a; 条件测试&#xff08;字符串比较、整数比较、文件状态&#xff09;、IF选择结构&#xff08;单分支、双分支、多分支&#xff09;、For循环结构、While循环结构 一、表达式比较评估 test 命令是 Unix 和 Linux 系统中用于评估条件表达式的命令。它通常用…

小乌龟运动控制-1 小乌龟划圆圈

目录 第一章 小乌龟划圆圈 第二章 小乌龟走方形 文章目录 目录前言一、准备工作步骤一&#xff1a;创建ROS工作空间步骤二&#xff1a;创建ROS包和节点步骤三&#xff1a;编写Python代码步骤四&#xff1a;运行ROS节点总结 前言 本教程将教会你如何使用Python编写ROS小海龟节…

【SpringCloud】(一文通)优雅实现远程调用-OpenFeign

目 录 一. RestTemplate存在问题二. OpenFeign介绍三. 快速上手3.1 引入依赖3.2 添加注解3.3 编写 OpenFeign 的客户端3.4 远程调用3.5 测试 四. OpenFeign 参数传递4.1 传递单个参数4.2 传递多个参数4.3 传递对象4.4 传递JSON 五. 最佳实践5.1 Feign 继承方式5.1.1 创建⼀个Mo…

马克思发生器有什么用_马克思发生器工作原理

马克思发生器&#xff08;Marx Generator&#xff09;是一种电气装置&#xff0c;用于产生高压脉冲电压。它由多个电容器组成&#xff0c;这些电容器依次连接在一系列开关之后。首先&#xff0c;每个电容器被并联充电至较低的电压。然后&#xff0c;这些电容器被开关依次串联&a…

C++过生日(我给我自己做的生日礼物)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言…

电源自动测试系统:测试柜的组成与功能

为了提高电源测试的效率和安全性&#xff0c;电源自动化测试柜是电源ATE自动测试系统的重要设备&#xff0c;不仅对示波器、万用表等测试仪器起保护作用&#xff0c;更是在测试过程中降低了安全风险&#xff0c;方便了电源产品的自动化测试。 电源自动测试系统机柜 电源自动化测…

C++初学(15补充)

15.1、嵌套循环和二维数组 下面讨论如何使用嵌套for循环来处理二维数组。到目前为止&#xff0c;我们一直学的是一维数组&#xff0c;因为每一个数组都可以看作是一行数据。二维数组更像是一个表格——既有数据行也有数据列。C并没有提供二维数组类型&#xff0c;但是用户可以…

电池的入门

目录 化学电池主要参数电池种类常用电池 物理电池太阳能电池 化学电池 主要参数 1.容量 2.标称电压 3.内阻 4.充电终止电压 5.放点终止电压 电池种类 按能否充电分&#xff1a; 原电池&#xff08;Primary Cell&#xff09;&#xff1a;只能放电不能充电的电池&#xff0c…

FastGPT如何增减用户

背景 开源版本的FastGPT默认只有一个超级用户root&#xff0c;为了更好地管理应用和知识库&#xff0c;可以通过操作MongoDB数据库来增加新的用户和团队。 所需环境 已安装并运行的FastGPT实例MongoDB客户端工具&#xff08;如Mongo Shell或Robo 3T等&#xff09; 操作步骤…

一文带你了解React Hooks

目录 一、useState 二、useRef 三、useEffect 四、自定义Hook 五、Hooks使用规则 Hooks原意是“挂钩”&#xff0c;指将类组件中的部分功能直接可以挂钩到函数组件中&#xff0c;例如state、生命周期方法、副作用等功能。 为什么使用Hooks&#xff1f; 封装代码&#xff…

Harmony鸿蒙应用开发:解决Web组件加载本地资源跨域

鸿蒙开发文档中有一节 加载本地页面 提到了可以通过 $rawfile 方法加载本地 HTML 网页&#xff1a; Index.ets 1Web({ src: $rawfile("local.html"), controller: this.webviewController })但是如果在 local.html 中需要引用一些静态资源&#xff0c;例如图片、JS、…

STM32——TIM定时器的输入捕获功能

一、什么是输出比较与输入捕获&#xff1f; 可以看到&#xff1a; 输出比较OC是用于输出一定频率和占空比的PWM波形&#xff0c;可用于电机驱动进行调速等&#xff1b;而输入捕获IC是用于测量PWM波形的频率以及占空比等参数&#xff1b;和他们的名字相反&#xff0c;一个是比…

Datawhale AI夏令营第四期魔搭- AIGC文生图方向 task01笔记

目录 分任务1&#xff1a;跑通baseline 第一步——搭建代码环境 第二步——报名赛事 第三步——在魔搭社区创建PAI实例 分任务2&#xff1a;相关知识学习以及赛题理解 赛题理解&#xff1a; 文生图基本认识&#xff1a; 1. Diffusion Model(扩散模型) 2. LDMs&#x…

嵌入式Linux学习笔记

1.文件操作命令 2.VI编辑器的部分命令 3.Uboot命令设置环境变量 4. uboot 的顶层 Makefile的重点是“make xxx_defconfig”和“make”这两个命令 &#xff0c;分别如下&#xff1a; 5.在串口SecureCRT中利用uboot启动Linux内核的两种方式 6.Linux内核移植到开发板上也可以反…

常见错误导引 不锈钢螺钉的正确选购和使用分析

紧固件或螺钉是用于固定物体的机械工具。它们用于各种场景&#xff0c;从建造房屋、用具、玩具等。紧固件由多种材料制成&#xff0c;所有这些材料都有特定用途紧固件和用途。一些用于制造螺丝的材料包括不锈钢、铁、铜、铝和塑料。它通常会进行某种表面处理以提高其防锈性和/或…

day-40 合并区间

思路 将二维数组按照第一列升序排列&#xff0c;把intervals[0][0]作为第一个区间的起点&#xff0c;将 intervals[0][1]和intervals[1][0]进行比较&#xff0c;如果intervals[0][1]<intervals[1][0]&#xff0c;则不能合并&#xff0c;否则可以合并&#xff0c;将Math.max(…

绝对不能错过的60个Python日常高频写法总结!

一、 数字 1 求绝对值 绝对值或复数的模 In [1]: abs(-6)Out[1]: 62 进制转化 十进制转换为二进制&#xff1a; In [2]: bin(10)Out[2]: 0b1010十进制转换为八进制&#xff1a; In [3]: oct(9)Out[3]: 0o11十进制转换为十六进制&#xff1a; In [4]: hex(15)Out[4]: 0xf…

[ICS] 物理安全

工业控制系统安全气泡类比 这个理念是&#xff0c;为了防御那些无法更新到最新安全控制措施的旧系统&#xff0c;或者由于设备资源有限而无法处理安全控制措施的系统&#xff0c;帮助可视化这种设备的安全策略可以将它们放置在一个肥皂泡或玻璃泡中。泡中的系统和设备彼此信任…

Spring Cloud Stream与Kafka(一)

Spring Cloud Stream与Kafka&#xff08;一&#xff09; ​ 在实际开发过程中&#xff0c;消息中间件用于解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高可用、高性能、可伸缩和最终一致性架构。不同的消息中间件实现方式不同&#xff0c;内部…