从初学者的角度来理解指针常量和常量指针

news2024/11/29 12:38:01

重新理解指针常量,常量指针

应用

我先提一个问题:知道指针常量,常量指针存在的作用是什么吗?
先了解它们存在的作用再去理解它们,或许更轻松些。

比如配置文件读取:在许多工程中,配置文件用于存储应用程序的设置和参数。当开发在写读取配置文件接口时,需要考虑两个重要问题:
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是一个指针常量,它指向一个只读的整数数组。通过使用指针常量,可以确保数据表的内容不被修改。

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

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

相关文章

linux 下 网卡命名改名

Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,而 CentOS7 提供了不同的命名规则,默认是网卡命名会根据网卡的硬件信息,插槽位置等有关;来分配。这样做的优点是命名全自动的、可预知的,缺点是比 eth0、…

计算机服务器被360后缀勒索病毒攻击怎么办,勒索病毒解密

计算机技术的不断发展,不仅方便了企业的生产生活,也为社会的发展带来了巨大贡献,但随之而来的网络威胁也不断增加,勒索病毒就是其中较为常见的常见的威胁。近期,我们收到很多企业的求助,企业的计算机服务器…

volatile,解决内存可见性引起的问题,wait和notify

补充:synchronized(务必会读(辛可肉耐子)会写),要搭配一个对象的时候,不一定非要是访问的this成员 synchronized(锁对象){ 代码块} public synchronized static void func(){} 静态方…

JS+CSS实现内凹导航栏

在移动互联网时代,导航栏是一个非常重要的元素,它能够帮助用户快速找到所需的信息。下面使用JS CSS实现一个内凹导航栏,内凹导航栏则是一种比较流行的设计风格,它能够让导航栏看起来更加立体和美观,视觉效果也非常不错…

vue : 无法加载文件 C:\Users\…\npm\vue.ps1,因为在此系统上禁止运行脚本。

在 PowerShell 中创建 vue 项目时,出现了以下错误导致创建失败:vue : 无法加载文件 C:\Users\…\npm\vue.ps1,因为在此系统上禁止运行脚本。 报错原因 用户权限不足导致无法加载文件,以管理员身份运行终端或者 PowerShell 也可…

使用Three.js制作一个旋转多面体

之前一直对three.js比较好奇,但是一直没有着手学习。今天刷到一篇博客(博主:1_bit),觉得挺有意思,就跟着敲了一下。 html: 其中canvas用于添加渲染好的元素,本篇文章通过CDN形式引入three.js,…

2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?

2023 Gartner RPA魔力象限报告解读:象限跃升彰显国产RPA厂商实力 2023 Gartner RPA魔力象限报告四大行业趋势,国产RPA厂商已在践行 文/王吉伟 8月3日,全球著名咨询调查机构Gartner发布了《2023年全球RPA魔力象限(Gartner RPA M…

ceph相关概念和部署

Ceph 可用于向云提供 Ceph 对象存储 平台和 Ceph 可用于提供 Ceph 块设备服务 到云平台。Ceph 可用于部署 Ceph 文件 系统。所有 Ceph 存储集群部署都从设置 每个 Ceph 节点,然后设置网络。 Ceph 存储集群需要满足以下条件:至少一个 Ceph 监控器&#x…

10分钟学会阿里OSS对象存储

一. 前言 最近有很多小伙伴问,如果我们要进行大规模的文件存储该怎么做? 其实实现文件存储的技术有很多,如果我们在网上搜索一下,你会发现实现的技术简直是五花八门,比如有一种技术叫FastDFS就可以实现文件存储,但该…

Effective Java笔记(31)利用有限制通配符来提升 API 的灵活性

参数化类型是不变的&#xff08; invariant &#xff09; 。 换句话说&#xff0c;对于任何两个截然不同的类型 Typel 和 Type2 而言&#xff0c; List<Type1 &#xff1e;既不是 List<Type 2 &#xff1e; 的子类型&#xff0c;也不是它的超类型 。虽然 L ist<String…

问道管理:零基础学炒股?

跟着股市的不断升温&#xff0c;越来越多的人参加到了炒股大军中&#xff0c;希望经过股市赚到更多的金钱。但是关于零根底的新手来说&#xff0c;怎么开始学习炒股成为了一个难题。那么&#xff0c;零根底学炒股真的难吗&#xff1f;怎么更好的入门和学习&#xff1f; 首要&am…

线性代数(三) 线性方程组

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

模型、策略和算法

模型(model)、策略(strategy)和算法(algorithm)是统计学习的所有内容. 模型是统计学习的最终结果&#xff0c;即决策函数(decision function) 或条件概率函数 &#xff0c;它被⽤来预测特定问题下&#xff0c;将来未知输⼊的输出结果. 策略是统计学习过程中的产⽣最优模型的评…

如何使用vue创建一个项目

1、安装node.js 打开cmd 输入node -v 和npm -v查看电脑是否已经安装了node,js 如果出现以下截图&#xff0c;则说明已经有node.js&#xff0c;可忽略此步 如果没有&#xff0c;则打开官网&#xff0c;下载即可 下载地址&#xff1a;Node.js 下载完成后&#xff0c;打开cmd输…

漏洞挖掘日记1:企业src某系统存在登录绕过漏洞

&#xff08;一&#xff09;漏洞描述 这个漏洞属于逻辑漏洞&#xff0c;逻辑漏洞是指开发者在开发过程中&#xff0c;实现业务上出现了逻辑上的漏洞。之所以出现逻辑漏洞&#xff0c;是因为一些开发者&#xff0c;在开发过程中&#xff0c;第一考虑是怎么实现功能&#xff0c;…

OPENCV C++(十)gramm矫正+直方图均衡化

两者都是只对单通道使用&#xff0c;对多通道的话 就需要分离通道处理再合并通道 两种方法&#xff0c;第一个要运算次数太多了&#xff0c;第二个只需要查表 伽马矫正函数&#xff0c;这里用第二种方法&#xff0c;且写法有点高级 int gammaCorrection(cv::Mat srcMat, cv::…

路由器和交换机的区别

交换机和路由器的区别 交换机实现局域网内点对点通信&#xff0c;路由器实现收集发散&#xff0c;相当于一个猎头实现的中介的功能 路由器属于网络层&#xff0c;可以处理TCP/IP协议&#xff0c;通过IP地址寻址&#xff1b;交换机属于中继层&#xff0c;通过MAC地址寻址(列表)…

聚观早报 | 真我GT5系列工艺细节曝光;小米MIXFold3定妆照抢先看

【聚观365】8月10日消息 真我GT5系列工艺细节曝光小米MIX Fold 3定妆照抢先看360智脑整体能力提升15%科大讯飞智能办公本X3正式发布索尼第二季度营收增长33% 真我GT5系列工艺细节曝光 在此前举办的ChinaJoy2023上&#xff0c;作为手机行业新势力的真我realme携手旗下多款爆款…

JavaWeb 速通Session

目录 一、Session的引入 1.什么是Session&#xff1f; 2.Session的基本原理 : 3.Session长什么样子&#xff1f; 二、Session的底层机制 1. Session接口相关的方法 : 1 req.getSession() : 2 httpSession.setAttribute(String name, Object val); 3 Object obj httpSessi…

Python(七十五--总结)列表、字典、元组、集合总结

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…