从初学者的角度来理解指针常量和常量指针
重新理解指针常量,常量指针
应用
我先提一个问题:知道指针常量,常量指针存在的作用是什么吗?
先了解它们存在的作用再去理解它们,或许更轻松些。
比如配置文件读取:在许多工程中,配置文件用于存储应用程序的设置和参数。当开发在写读取配置文件接口时,需要考虑两个重要问题:
1.配置文件的存储路径,不能随意被更改。
2.配置文件的内容,不能随意被修改
那么如何确保以上两点呢?就是运用指针常量和常量指针来实现。代码如下:
const char* const CONFIG_FILE_PATH = "config.ini";
/* 代码说明如下:
1.通过使用常量指针来读取配置文件中的数据,确保配置文件的内容不被修改。
2.CONFIG_FILE_PATH是一个指针常量,它指向一个不可修改的配置文件路径。
*/
void readConfigFile(const char* const filePath) {// 读取配置文件的内容// ...
}
int main() {readConfigFile(CONFIG_FILE_PATH);return 0;
}
我的理解
通过上一个实例说明,常量指针,指针常量限制了“内容”“路径”被指针随意修改,从C语言术语来阐述应该是“值”“地址”不能被指针修改。现在我们只是了解指针常量,常量指针的运用实例。
假设你已经理解const关键字,那么下面我们正式来分析指针常量,常量指针。
指针常量(Pointer to constant)
格式:
int* const ptr;
//int *(指针) const(常量) ptr
//(指针)(常量)
上面不规范的注释能get到意思吗?先有解引用*号,后有常量(constant),就叫指针常量。
指针常量限制的是“地址”还是“值”呢?请看下面
int a = 0;
int* const ptr = &a;
//int * (const ptr) = &a;
//ptr是a的地址,const ptr就是限制地址
//注意:上述解引用*号优先级比括号高,使用括号只是为了方便理解
简单总结下,指针常量限制的是指针地址,指针常量实验1:

当我想改变b的地址,编译报错。
那可以改变b指向的地址所存储的值吗?即可以使用b改变a的值吗?指针常量实验2:

通过实验2,能够清晰的看到,b一直是a的地址,a的值被两次改变。
指针常量总结:
1.如何准确判断是指针常量 :(* const),指针(*)常量(const)
2.如何判断限制的是什么: int * (const a) = &b; (不规范,仅方便理解),限制a的指向不被指针更改,但是指向地址的值可以被更改。
常量指针(Constant Pointer)
格式:
int a = 0;
const int* ptr = &a;
//const int (* ptr) = &a;
//(* ptr)是a的值,因此const (* ptr)就是限制a的值不被改变
//注意:上述解引用*号优先级比括号高,使用括号只是为了方便理解
简单总结下,常量指针限制的是指向地址的值不能被指针更改。常量指针实验1:

常量指针实验1能够看出,a的值无法被指针修改。
常量指针实验2:

常量指针实验2能够看出,指针b指向的地址可以被改变,指向变量c,a的值没有被改变。
再谈应用
本文开始没有直接讨论指针常量,常量指针的概念,而是从工程实践运用的角度开始谈起,其实到这里已经可以结束。不过我还想分享工程实践的一个案例,让我们更明白指针常量存在的作用。
案例1:在嵌入式系统开发中,常常需要与硬件设备进行交互。通过使用指针常量来映射硬件寄存器的地址,可以方便地读取和写入寄存器的值,但同时肯定要防止开发者更改寄存器地址。例如:
volatile uint32_t* const GPIO_PORTA = (uint32_t*)0x40020000;
在这个例子中,GPIO_PORTA是一个指针常量,它指向硬件设备的寄存器地址。通过使用指针常量,可以直接访问硬件寄存器的值。
**案例2:**在一些应用中,需要定义一些常量数据表,例如查找表、配置表等。通过使用指针常量,可以将这些数据表存储在只读的内存区域,提高程序的效率和安全性。
const int* const LOOKUP_TABLE = {1, 4, 9, 16, 25};
在这个例子中,LOOKUP_TABLE是一个指针常量,它指向一个只读的整数数组。通过使用指针常量,可以确保数据表的内容不被修改。
相关文章:
从初学者的角度来理解指针常量和常量指针
重新理解指针常量,常量指针 应用 我先提一个问题:知道指针常量,常量指针存在的作用是什么吗? 先了解它们存在的作用再去理解它们,或许更轻松些。 比如配置文件读取:在许多工程中,配置文件用于…...
C# OpenCvSharp 去水印 图像修复
效果 项目 VS2022.net4.8OpenCvSharp4 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; usi…...
考研算法第40天:众数 【模拟,简单题】
题目 本题收获 又是一道比较简单的模拟题,就不说解题思路了,说一下中间遇到的问题吧,就是说cin输入它是碰到空格就停止输入的,详细的看下面这篇博客对于cin提取输入流遇到空格的问题_while(cin) 空格_就是那个党伟的博客-CSDN博…...
MySQL:内置函数、复合查询和内外连接
内置函数 select 函数; 日期函数 字符串函数 数学函数 其它函数 复合查询(多表查询) 实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张 表EMP,DEPT,SALGRADE来演示如何进行多表查询…...
【HTML】label 标签
在HTML中,<label> 标签用于为表单元素创建标签文本或标题。它可以与输入字段(如文本框、单选按钮、复选框等)和其他表单元素关联起来,以提高可用性和可访问性。 <label> 元素有两种常见的用法: 包裹方式…...
python视频流截图(按帧数)
一、安装opencv计算机视觉库 pip install opencv-python二、视频流截图 1、读取视频文件,获取视频帧数 import cv2 # 视频位置 video_path path_file_name # 读取视频 cap cv2.VideoCapture(video_path) # 获取视频总帧数 frame_count cap.get(cv2.CAP_PROP_F…...
MongoDB SQL
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin>net start MongoDB 请求的…...
node js连接mysql数据库
首先,确保你已经安装了 mysql2 模块。如果没有安装,可以使用以下命令进行安装: npm install mysql2创建一个 Node.js 脚本,例如 connectToMysql.js,并使用以下代码: const mysql require(mysql2);// 创建…...
通过Python模拟计算附近WIFI密码,没有我蹭不到的网
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天来分享一下如何通过 Python 脚本实现 WIFI 密码的自动猜解 无图形界面 先来看看怎么实现没有图形界面版的自动猜解。 WIFI猜解 导入模块 import pywifi from pywifi import const import time import datetime测试连…...
ubuntu20.04 远程桌面配置记录【亲测好用】
简介 ubuntu系统下有好几种不同方式的远程桌面方式,本人都使用过,以下是一些使用总结: vnc4server:其中vnc4server对gnome桌面支持不好 vino:系统自带,但需要用户登录一次后才能远程,并且需要安…...
解决selenium的“can‘t access dead object”错误
目录 问题描述 原因 解决方法 示例代码 资料获取方法 问题描述 在python执行过程中,提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到…...
Docker Dockerfile 使用方法
目录 Dockerfile 介绍 Dockerfile 示例 Dockerfile 介绍 当使用Docker构建容器化应用程序时,Dockerfile是一个用于定义容器镜像的文本文件。它包含了一系列指令,告诉Docker如何从基础镜像(通常是官方或自定义的操作系统镜像)构…...
(6)(6.3) 复合连接的故障处理
文章目录 6.3 复合连接的故障处理 6.4 相关话题 6.3 复合连接的故障处理 带有 F7 或 H7 处理器并有 CAN 接口的自动驾驶仪使用的固件提供两个 USB 接口。一个用于正常的 MAVLink 连接,一个用于 SLCAN 串行连接到 CAN 接口进行配置和固件更新。这被称为复合型 USB…...
报考红帽认证难不,红帽认证考试容易吗?
红帽认证是由红帽Linux公司推出的,红帽培训和测试非常注重培养实际的动手实战能力,主要包括RHCSA认证、RHCE认证和RHCA认证,每个等级的认证都是层层递进的。 要想参加RHCA认证就必须通过RHCE认证,且认证证书在有效期内方可参加。 …...
如何优雅地用VS编写C#代码——快捷键的使用
F4:打开属性面板 F5:调试 CtrlF5:直接执行,不挑食 F9:设置、切换断点 F10:逐过程 F11:逐语句 F12:转到定义 AltF12:查看定义 CtrlF:查找 CtrlKCtrlK&…...
微服务——操作索引库+文档操作+RestClient操作索引库和文档(java程序)
索引库操作 mapping属性 mapping是对文档的约束,常见约束属性包括: 创建索引库 #创建索引库 PUT /heima {"mappings": {"properties": {"info":{"type": "text","analyzer": "ik_smart"},…...
【性能测试】性能数据采集工具nmon安装使用及报告参数含义详解
目录 nmon nmon下载 解压安装 启动 数据采集配置 生成图形结果 nmon报告中的参数含义 资料获取方法 nmon nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,它能在系统运行过程中实时地捕捉系统资源的使用情况,并且能输出结果到文…...
『PostgreSQL』在 PostgreSQL中创建只读权限和读写权限的账号
📣读完这篇文章里你能收获到 理解在 PostgreSQL 数据库中创建账号的重要性以及如何进行账号管理掌握在 PostgreSQL 中创建具有只读权限和读写权限的账号的步骤和方法学会使用 SQL 命令来创建账号、为账号分配适当的权限以及控制账号对数据库的访问级别了解如何确保…...
基于Java+SpringBoot+Vue的网上书城管理系统设计与实现(源码+LW+部署文档等)
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...
安全渗透——AWK知识整理
1.awk的定义 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
