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

【C/C++】指针常量、常量指针、指向常量的常指针

目录

  • 1.概念
  • 2. const pointer
  • 3. pointer to a constant
    • 3.1 (pointer to a constant)-constant
    • 3.2 poiner-constant
    • 3.3 (pointer to a constant)-variable
    • 3.4 poiner-variable
    • 3.5 多层级关系时的兼容
    • 3.6 用处
  • 4. a constant pointer to a constant

1.概念

首先明确这几个术语的具体含义:

  1. 指针常量(常指针):英语为:const pointer,即指针自己是常量
  2. 常量指针:英语为:pointer to a constant,即不能通过该指针去修改目标的指针
  3. 指向常量的常指针:英语为:a constant pointer to a constant,指针自己既是常量,也不能通过该指针去修改目标的指针

从英语可以很快速的理解这几个术语的含义,但是由于翻译的问题,就导致大家在初学 C++ 时会很晕头转向,被这几个概念搞的摸不清头脑
同样由于翻译的问题,还存在下面这组术语:

  1. 常量指针:指针自己是常量,这一版翻译主要强调的是指针自己是常量
  2. 指向常量的指针:即不能通过该指针去修改目标的指针,这一组的中文名可以见名思意,一目了然
  3. 指向常量的常量指针:指针自己既是常量,也不能通过该指针去修改目标的指针

而第二组的翻译和第一组的翻译在常量指针的位置刚好出现了两种截然不同的结果,或许这就是很多人在网上搜文章时感觉都不是很统一的原因吧,一部分文章按照第一组翻译去解释意思,另一部分文章按照第二组去解释就会导致看下来更加的晕头转向了

防止读者产生误会,我会在后续使用英语名来代替中文名,另外读者不用过分纠结中文名字,只需要能够分辨清楚 const pointerpointer to a constant 的定义方法与用法即可

2. const pointer

const pointer 意为指针自己是常量,所以无法更改指针的指向,并且一定要对指针进行初始化
定义方法如下:

 int a=1;int *const p1=&a;

const 放在 * 后面,强调修饰的是 p1 ,所以 p1 是常量,这样有助于读者更好的理解

3. pointer to a constant

pointer to a constant 意为指向常量的指针,指针本身是可以变化的,而且指针可以指向变量也可以指向常量,唯一不行的是通过指针去修改变/常量的值
定义方法如下:

const int *p1;

或者

int const *p1;

const 放在 * 前面,强调修饰的是 *p1 ,所以 *p1 是常量,这样有助于读者更好的理解
pointer to a constant 不要求进行初始化,因为指针本身还是一个变量,只有常量才会要求必须进行初始化
下面的表格给出了 pointer to a constantt 和被指对象的类型的兼容性,表格中所有指针均可以重新指向别的对象

pointer to a constant(指向常量的指针)poiner(普通指针)
constant(常量)×
variable(变量)

下面来逐一分析表格中的情况:

3.1 (pointer to a constant)-constant

对应下列的代码:

const int a=1;
const int *p1=&a;

该代码定义了一个常量 a ,并且将指针 p1 指向了常量 a,常量 a 不可以被任何方式进行修改

3.2 poiner-constant

假设下列的语句是合法的(下列语句是错误的):

 const int a=1;int *p1=&a;

那么就可以通过 *p1 来修改常量 a 的值,这与常量的概念不符,故不可以让普通指针指向常量

3.3 (pointer to a constant)-variable

对应下列的代码:

int a=1;
const int *p1=&a;

该代码定义了一个常量 a ,并且将指针 p1 指向了变量 a,变量 a 可以被直接修改,但是不可以通过 *p1 的方式对 a 进行修改

3.4 poiner-variable

对应下列的代码:

int a=1;
int *p1=&a;

该代码定义了一个常量 a ,并且将指针 p1 指向了变量 a,变量 a 可以被直接或者使用 *p1 修改

3.5 多层级关系时的兼容

这里先明确一个概念:在上述的代码中,只是涉及到了一层间接关系,即指针指向的是基本数据类型(不是指针),而在多层间接关系中,上述的部分规则将会不再适用
例如下面的代码在一层间接关系中是正确的:

int a=1;
const int *p1=&a;

pointer to a constant 可以与变量进行兼容,只是不能通过指针修改变量
而在二层间接关系时,这样的代码就会失效:

int a=1;
int *p2 = &a;
const int **p3 = &p2;

pointer to a constant 不能和普通指针兼容,若要使 p3 获得 p2 的地址,可以做如下的改动:

int a=1;
int *p2 = &a;
int **p3 = &p2;

或者

int a=1;
const int *p2 = &a;
const int **p3 = &p2;

在涉及到多层间接关系时,不允许 constnon-const 进行混用

3.6 用处

在进行函数调用时,若传参是数组,由于传递的时数组首地址,则可能调用函数时修改了原数组的内容,所以可以在定义函数时,声明 pointer to a constant 的形参,来防止函数内部修改数组,例如:

#include <iostream>
using namespace std;
int add(const int *begin,const int *end){int sum=0;for(;begin!=end;begin++)sum+=(*begin);return sum;
}
int main(){int arr[5]{1,2,30};cout<<add(arr,arr+5);return 0;
}

定义 add 函数时,形参声明为 pointer to const 防止对数组元素进行修改,同时还带来一个好处:不管入参是否为常量数组,它都可以进行接收,例如在主函数中,把 arr 改为 const 修饰,程序也可以运行,而如果是普通指针用作形参,则不能接收常量数组

4. a constant pointer to a constant

a constant pointer to a constant 含义为:指针的指向不可以改变,指针可以指向变量也可以指向常量,但是不能通过指针去修改变/常量的值,它的性质就像是 const pointerpointer to const 的结合体
定义方法如下:

int a=1;
const int *const p1=&a;

或者

int a=1;
int const*const p1=&a;

相关文章:

【C/C++】指针常量、常量指针、指向常量的常指针

目录 1.概念2. const pointer3. pointer to a constant3.1 (pointer to a constant)-constant3.2 poiner-constant3.3 (pointer to a constant)-variable3.4 poiner-variable3.5 多层级关系时的兼容3.6 用处 4. a constant pointer to a constant 1.概念 首先明确这几个术语的…...

【VUE复习·4】计算属性computed:原理、完整写法(不常用)、与 methods 的区别、简写(最常用)、应用案例!

总览 1.简介计算属性 2.computed 与 methods 的区别 3.computed 的简写&#xff08;不修改计算属性&#xff0c;只显示&#xff09; 4.经典应用场景 一、计算属性 1.为什么需要计算属性&#xff1f; 首先&#xff0c;如果我们要写一个插值语法&#xff0c;而 {{ }} 内的内容…...

Linux 基本语句_编译C过程

Linux撰写C语言并编译的过程 1、预处理 将所有的#define删除&#xff0c;并且展开所有的宏定义&#xff0c;并且处理所有的条件预编译指令&#xff0c;比如#if #ifdef #elif #else #endif等。处理#include预编译指令&#xff0c;将被包含的文件插入到该预编译指令的位置。删除…...

MYSQL8解压版 windows 主从部署步骤及配置(包含配置文件,教程文件,免积分下载)

MYSQL8解压版 windows 主从部署步骤及配置 一.安装MSYQL 这里只讲大概,详细步骤、my.ini文件、安装包等会在页尾文件中(正常情况按首个mysql安装,只是名字有区别) 1.主库my.ini配置 [mysqld] #典型的值是5-6GB(8GB内存)&#xff0c;8-11GB(16GB内存), 20-25GB(32GB内存)&…...

RabbitMQ的基本介绍

什么是MQ 本质是一个队列&#xff0c;只不过队列中存放的信息是message罢了&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递信息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后&#xff0c;信息发送…...

AI智能视频监控技术如何助力美好乡村建设?

随着城市化发展&#xff0c;很多乡村设施也在逐渐完善&#xff0c;智能监控也成了乡村发展必不可少的一环&#xff0c;智能视频监控应该在乡村建设里如何发挥作用呢&#xff1f; 1、有效提升安全意识 通过在乡村重要区域、公共场所、道路等设置智能视频监控设备&#xff0c;可…...

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加&#xff0c;随着国家等保政策的严格执行&#xff0c;越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌&#xff0c;让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …...

makefile相关知识的讲解

目录 makefile文件的介绍 step1&#xff1a;手动创建一个makefile文件 step2&#xff1a;在文件当中编辑指定的命令 step3&#xff1a;退出makefile文件并使用make执行文件当中的命令 step4&#xff1a;使用clean指令清除生成的文件 makefile当中的命令编写方式 目标文件和依…...

OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?

一、简述 基于OpenCV进行直线检测可以使用HoughLines和HoughLinesP函数完成的。这两个函数之间的唯一区别在于,第一个函数使用标准霍夫变换,第二个函数使用概率霍夫变换(因此名称为 P)。概率版本之所以如此,是因为它仅分析点的子集并估计这些点都属于同一条线的概率。此实…...

Xilinx FPGA 程序固化重新上电程序不运行的问题

问题描述 FPGA直接下载bit文件,功能正常。 FPGA擦除FLASH,烧写FLASH,正常。 电源断电,重新上电,FALSH里面的程序没有启动,FPGA程序没有跑起来。–FLASH启动不正常。 解决办法 在XDC约束文件里边增加约束: ## Configuration options, can be used for all designs se…...

c++ 使用rapidjson对数据序列化和反序列化(vs2109)

RapidJSON是腾讯开源的一个高效的C JSON解析器及生成器&#xff0c;它是只有头文件的C库&#xff0c;综合性能是最好的。 1. 安装 在NuGet中为项目安装tencent.rapidjson 2. 引用头文件 #include <rapidjson/document.h> #include <rapidjson/memorystream.h> #…...

4.迭代最近点ICP及非线性优化求解

使用非线性优化方法求解ICP 文章目录 使用非线性优化方法求解ICP前情提要ICP问题回顾对矩阵变量求导数 ICP问题的非线性解法代码示例 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 前情提要 在迭代最近点算法ICP及SVD求解中介绍了ICP问…...

【redis总结】

文章目录 1、redis简介2、为什么要选择redis做缓存3、数据结构4、redis多线程模型redis6.0的变化 5、redis持久化AOF的实现过程RDB的实现过程 6、redis集群的搭建7、 redis过期删除和淘汰策略8、redis的内存淘汰策略 1、redis简介 Redis&#xff08;Remote Dictionary Server&…...

图数据库:释放关系的力量

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 在数据管理领域&#xff0c;图数据库已经成为一种强大的工具&#xff0c;它彻底改变了我们处理和分析复杂关系的方式。与依赖表和列的传统关系数据库不同&#xff0c;图…...

Windows系统如何临时关闭“Windows安全中心实时保护”

前言 启动windows depender实时保护可能会使系统不太流畅&#xff0c;也可能会导致我们的程序无法正常运行&#xff0c;因为它会拦截或搜索我们的正常工作。 暂时关闭windows depender的实时保护对许多用户来说非常重要。 一、Win10系统关闭方法 打开Windows安全中心&#…...

二叉树MFC实现

设有一颗二叉树如下&#xff1b; 这似乎是一颗经常用作示例的二叉树&#xff1b; 对树进行遍历的结果是&#xff0c; 先序为&#xff1a;3、2、2、3、8、6、5、4&#xff0c; 中序为&#xff1a;2、2、3、3、4、5、6、8&#xff0c; 后序为2、3、2、4、5、6、8、3&#xff1b…...

Nginx之客户并发数限制解读

目录 基本介绍 配置指令 limit_conn_zone limit_conn 其他 limit_rate limit_rate_after limit_req_zone limit_req 基本介绍 在我们进行系统开发设计中&#xff0c;要考虑服务器流量异常&#xff0c;负载过大等问题。对于大流量恶意的攻击访问&#xff0c;会带来带宽…...

白捡一个存储型XSS

本文由掌控安全学院 - 杳若 投稿 起因 利用fofa搜索时发现 org"China Education and Research Network Center" && body"/register" 任意用户注册 在找到该CMS的时候发现存在任意用户注册的情况 http://xxxx.edu.cn/student/Register.ashx …...

SpringMVC 学习(五)转发,重定向和传参

6. 转发和重定向 Spring MVC 的底层是 servlet&#xff0c;因此在 Spring MVC 中也存在转发和重定向的概念。 对于转发而言&#xff0c;其目的页面可以在 WEB-INF 目录下。重定向的目的页面不允许在 WEB-INF 目录下&#xff0c;因为重定向相当于用户再次发起一次请求&#xf…...

selenium不定位元素直接使用键盘操作(如弹框操作)

今天在使用selenium进行定位时&#xff0c;发现直接定位不了chrome的弹框&#xff0c;如这种弹框&#xff1a; 使用的是下面这行代码 driver.switch_to.alert.accept() 运行报错&#xff0c;说是没有 alert windown。。。。 啊&#xff1f;难道chrome的弹框不是用alert写的&…...

Cropper.js进阶玩法:打造一个可撤销、可缩放、带滤镜的在线图片编辑器

Cropper.js进阶玩法&#xff1a;打造一个可撤销、可缩放、带滤镜的在线图片编辑器 在当今数字内容创作蓬勃发展的时代&#xff0c;轻量级在线图片编辑工具的需求与日俱增。Cropper.js作为一款优秀的JavaScript图片裁剪库&#xff0c;其潜力远不止于基础的裁剪功能。本文将带您深…...

ClaudeCode入门08-Git配合(小白入门:不知道怎么写Git提交记录?让AI自动帮你写好)

🎯 本文目标 学会用 Claude Code 自动化 Git 工作流:自动写 Commit Message、管理分支、处理冲突。 😰 Git 新手的痛点 git commit -m "fix" git commit -m "update" git commit -m "修改了一些东西" 不知道 Conventional Commits 是什么 …...

TQVaultAE终极指南:解锁泰坦之旅无限仓库与装备管理新境界

TQVaultAE终极指南&#xff1a;解锁泰坦之旅无限仓库与装备管理新境界 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 你是否曾在泰坦之旅的冒险中&#xff0c;面对满仓的传…...

5步掌握Betaflight 2025升级:从配置到飞行的完整解决方案

5步掌握Betaflight 2025升级&#xff1a;从配置到飞行的完整解决方案 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为穿越机飞行抖动和信号不稳定而烦恼吗&#xff1f;Betaflight …...

SAP供应商创建后,BP界面贸易伙伴字段不显示?手把手教你用FS_API_BP001_CHANGE补传数据

SAP供应商创建后BP界面贸易伙伴字段不显示的解决方案 在SAP系统中创建供应商时&#xff0c;经常会遇到一个令人困惑的问题&#xff1a;明明已经通过标准BAPI&#xff08;如vmd_ei_api&#xff09;将贸易伙伴信息成功写入数据库表LFA1的VBUND字段&#xff0c;但在业务伙伴(BP)界…...

从零开始:sherpa-onnx跨平台语音识别终极指南

从零开始&#xff1a;sherpa-onnx跨平台语音识别终极指南 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support…...

三大核心突破:构建企业级实时图表编辑系统的架构演进

三大核心突破&#xff1a;构建企业级实时图表编辑系统的架构演进 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

Uvicorn搭配FastAPI实战:5分钟从安装到部署一个高性能API接口

Uvicorn搭配FastAPI实战&#xff1a;5分钟从安装到部署一个高性能API接口 在Python生态中构建高性能API从未如此简单。当开发者需要快速搭建一个既能处理高并发请求又具备优雅代码结构的服务时&#xff0c;FastAPI与Uvicorn的组合正成为越来越多技术团队的首选方案。这套组合拳…...

从‘监控谁’到‘如何查’:手把手教你用Prometheus标签玩转K8s监控数据筛选

从‘监控谁’到‘如何查’&#xff1a;手把手教你用Prometheus标签玩转K8s监控数据筛选 在Kubernetes集群监控领域&#xff0c;数据洪流是每个运维人员必须面对的挑战。当数百个Pod不断创建销毁时&#xff0c;传统静态配置的监控方式显得力不从心。这正是Prometheus标签系统大显…...

DAG账本项目学习总结(七):MySQL 持久化与 Redis 缓存机制源码解析

1. 上期回顾在第六期中&#xff0c;我们分析了云端广播与交易确认机制。可以简单概括为&#xff1a;融合终端生成交易↓ 写入本地 DAG 账本↓ 广播给 cloud 和其他 fusion↓ cloud 插入全局账本↓ cloud 根据累计权重产生确认动作↓ 确认动作同步回各融合终端到这里为止&#x…...