1. 指向常量的指针(指向const的指针)

指向const的指针,不能改变其所指变量(对象)的值,或者说不能通过这个指向const的指针去改变所指的变量(对象)的值

// 指向const的指针,不能通过*cptr修改指向的变量(对象)的值
const double pi = 3.14;
const double *cptr = π // 错误,不能通过解引用指针来修改所指变量(对象)的值
*cptr = 42

2. 常量指针(const指针)

const指针,在初始化后,不能改变这个const指针中存放的地址,或者说这个const指针在初始化时,指向了一个变量(对象)后,就不能再改变这个const指针的指向了

// const指针
int errNumb = 0;
int newVal = 77;
int *const curErr = &errNumb; // 错误,不能修改指针的指向
curErr = &newVal;

3. 指向常量的常量指针(指向const变量的const指针)

此标题所指的const变量==常量==常量对象

指向const变量的const指针,不论是其所指的变量(对象)的值还是自身存放的地址都不能改变,或者说不能通过这个指针去改变所指的变量(对象)的值,在指针初始化后也不能改变这个指针的指向

const double pi = 3.14;
const double newVal = 77.88;
const double *const pip = π // 错误,不能修改指针的指向
pip = &newVal; // 错误,不能通过解引用指针来修改所指变量(对象)的值
*pip = 7.62;

4. 识别常量指针----不可修改指针的指向

int errNumb = 0;
int newNumb = 7;
int *const curErr = &errNumb; const double pi = 3.14;
const double pp = 8.88; // 指向常量的常量指针
const double *const pip = π // 正确,可修改指向的对象的值
*curErr = 8; // 错误,不可修改指针的指向,即初始化后不可重新指向一个其他的对象
curErr = &newNumb; // ---------------------------------------------------------- // 错误,不可修改指向的对象的值
*pip = 7.62; // 错误,不可修改指针的指向,即初始化后不可指向一个其他的对象
pip = &pp;

上述代码中,从右往左阅读定义:

离curErr最近的符号是const,意味着curErr本身是一个常量对象,再往左读是一个*,意味着curErr此时是一个常量指针

由此可知,pip也是一个常量指针 ,也就是说,只要符合按*const 标识符这样一种顺序组合的指针,就是一个不可修改指针指向的常量指针

5. 识别指向常量的指针----可修改指针的指向

const double pi = 3.14;
const double pp = 7.62; const double *cptr = π // 错误,不可修改指向的对象的值
*cptr = 42; // 正确,可修改指针的指向
cptr = &pp;

上述代码中,从右往左阅读定义:

离cptr最近的符号是*,往左是一个数据类型,此为double,再往左是const,意味着cptr此时是一个指向常量的指针

因为cptr是一个指针,它指向一个常量pi,所以称cptr是一个指向常量的指针

也就是说,只要符合const 数据类型 *标识符这样一种顺序组合的指针,就是一个不可修改指向对象的值的指向常量的指针

值得一提的是,指向常量的指针可以修改其指向

6. 总结

指向常量的指针:不能用于改变所指变量(对象)的值,但能修改指针的指向

常量指针:不能改变指针的指向,即不能改变指针自身存储的地址值

指向常量的常量指针:既不能改变指针所指的变量(对象)的值,也不能改变指针的指向

Tips:

实际上,指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型

如,pip是一个指向常量的常量指针,则不论是pip所指的对象值还是pip自己存储的那个地址都不能改变

相反,curErr指向的是一个一般的非常量整数errNumb,因为errNumb不是一个常量,那么就完全可以用curErr去修改errNumb的值

指向const的指针和const指针的区别的更多相关文章

  1. 指向const的指针和const指针

    1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...

  2. const的理解、const指针、指向const的指针

    1.const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量.也就是说经过const 修饰的 ...

  3. 指针总结指向const的指针、const指针、指向const指针的const指针

    指针的一些总结   const与指针 指向const的指针指的是指针指向的数据是常量,不可以被修改,但指针变量本身可以被修改,如const int *p:严格说不能用指针间接修改指向的数据,但该变量可 ...

  4. 指针与const

    指向常量的指针,不能用于改变其所指对象的值. 指针的类型必须与所指对象的类型一致,但是有两个例外,第一种是允许令一个指向常量的指针指向一个非常量对象: double dra1 = 3.14; cons ...

  5. C++杂谈(一)const限定符与const指针

    const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...

  6. C++中的指针与const

    刚开始接触C++时,指针和const之间的关系有点混乱,现在总结如下: 一.指向const变量的指针 #include<iostream.h> void main() { const in ...

  7. C++中const修饰基本数据类型、指针、引用、对象

    const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...

  8. C++ Prime:指针和const

    与引用一样,也可以令指针指向常量或非常量,类似于常量引用,指向常量的指针不能用于改变其所指对象的值.要想存放常量对象的地址,只能使用指向常量的指针: const double pi = 3.14; / ...

  9. 指针和const

    将指针参数声明为指向常量数据的指针有两条理由: 这样可以避免由于无意间修改数据而导致的编译错误.      使用const使得函数能够处理const和非const实参,否则将只能接收非const数据. ...

  10. 指针和Const限定符

    指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...

随机推荐

  1. 【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)

    1.问题描述: 客户端创建实况窗后,通过Push kit更新实况窗内容,这个过程是自动更新的还是客户端解析push消息数据后填充数据更新?客户端除了接入Push kit和创建实况窗还需要做什么工作? ...

  2. 用 Dockerfile 创建镜像的基本步骤有哪些?

    使用 Dockerfile 创建镜像的基本步骤如下: 定义基础镜像 在 Dockerfile 的开头,使用 FROM 指令指定一个基础镜像.例如: FROM ubuntu:latest 这表示基于最新 ...

  3. .net 8 C# 集成 AWS Cognito SMS/Email 注册与登录

    本文主要分为三个部分: 1.描述 cognito 涉及的专业术语 以及 交互流程 2..net 集成的代码 3.感想 * 阅读提示 :鼠标悬停在 章节标题 上可见 文章目录 1. Cognito 概念 ...

  4. Windows编程----进程:命令行参数

    什么是进程的命令行参数 每个进程在启动(双击exe启动.cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它.命令行的参数以空格区分.这个命令行总是不为空 ...

  5. C# 中的“相等判断”

    C# 中的"相等判断" C# 中判断相等的方式很多,例如: 双等号 ==​ 实例的 Equals()​ 方法 ​Object.Equals()​ 静态方法 ​Object.Refe ...

  6. kafka开启kerberos认证详细步骤

    一.kerberos安装部署 kerberos的基本原理不做过多介绍了,可自行查阅:本文主要介绍kerberos的安装及使用;使用到的软件版本:系统:Red Hat Enterprise Linux ...

  7. 【ffmpeg】avformat_alloc_context报错System.NotSupportedException不支持所指定的方法

    这个错误报了第二次了,网上搜不到靠谱的解决方案,赶快记录一下. 第一个情况:报错如题目System.NotSupportedException 不支持所指定的方法 第二个情况:如果换autogen版本 ...

  8. Java SE 24 新增特性

    Java SE 24 新增特性 作者:Grey 原文地址: 博客园:Java SE 24 新增特性 CSDN:Java SE 24 新增特性 源码 源仓库: Github:java_new_featu ...

  9. Linux-两台Linux服务器间设置共享文件夹(NFS服务器)

    一.环境信息服务器1:192.168.120.141        文件夹:/opt服务器2:192.168.120.142        文件夹:/opt将服务器1的/opt文件夹共享到服务器2的/ ...

  10. Delphi 执行一个外部程序,当外部程序结束后言主程序立即响应

    delphi 执行一个外部程序,当外部程序结束后言主程序立即响应 我们经常能看到360安全卫士进行windows系统升级时,执行windows升级程序,当升级程序执行完成后,360马上弹出提示框.这样 ...