可用七种不同的方式将 const 关键字用于二级指针,如下所示:

//方式一:所指一级指针指向的数据为常量,以下几种为等效表示
const int ** pptc; //方式一
int const ** pptc; //方式二 //方式二:所指一级指针为常量
int *const* pcpt; //方式三:二级指针本身为常量,需在声明时初始化
int x = 55;
int * pt = &x;
int ** const cppt = &pt; //方式四:二级指针本身为常量,所指一级指针也为常量,所指一级指针指向的数据也为常量,需在声明时初始化
int x = 55;
const int * pt = &x;
const int *const* const cpcptc = &pt; //方式五:二级指针本身为常量,所指一级指针也为常量,需在声明时初始化
int x = 55;
int * pt = &x;
int *const* const cpcpt = &pt; //方式六:二级指针本身为常量,所指一级指针指向的数据也为常量,需在声明时初始化
int x = 55;
const int * pt = &x;
const int ** const cpptc = &pt; //方式七:所指一级指针也为常量,所指一级指针指向的数据也为常量
int x = 55;
const int * pt = &x;
const int *const* pcptc = &pt;

Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int**const int** 等效,除此之外,const int const**Microsoft Visual Studio 中也与 const int** 等效。

以上七种类型指针的特性如下:

  • 类型为 const int ** 的指针 pptc 表示 **pptc 为常量,不能用该指针修改所指一级指针指向的数据的值,但可修改其所指一级指针的值,也可修改其所指向的地址(指针自身的值),只能将 const int * 类型的一级指针地址、const int **const int ** const 类型的二级指针值赋给 pptc
  • 类型为 int * const * 的指针 pcpt 表示 *pcpt 为常量,能用该指针修改所指一级指针指向的数据的值,不可修改其所指一级指针的值,但可修改其所指向的地址(指针自身的值),只能将 int *int * const 类型的一级指针地址、int **int ** constint * const *int * const * const 类型的二级指针值赋给 pcpt
  • 类型为 int ** const 的指针 cppt 表示 cppt 为常量,能用该指针修改所指一级指针指向的数据的值,也可修改其所指一级指针的值,但不可修改其所指向的地址(指针自身的值),只能将 int * 类型的一级指针地址、int **int ** const 类型的二级指针值赋给 cppt,且必须在声明时初始化。
  • 类型为 const int *const* const 的指针 cpcptc 表示 **cpcptc*cpcptccpcptc 都为常量,不能用该指针修改所指一级指针指向的数据的值,不可修改其所指一级指针的值,也不可修改其所指向的地址(指针自身的值),能将 int *int * constconst int *const int * const类型的一级指针地址、const int **const int ** constint **int ** constint * const *int * const * constconst int * const *const int *const* const 类型的二级指针值赋给 cpcptc,且必须在声明时初始化。
  • 类型为 int *const* const 的指针 cpcpt 表示 *cpcptcpcpt 都为常量,能用该指针修改所指一级指针指向的数据的值,不可修改其所指一级指针的值,也不可修改其所指向的地址(指针自身的值),能将 int *int * const 类型的一级指针地址、int **int ** constint * const *int * const * const 类型的二级指针值赋给 cpcpt,且必须在声明时初始化。
  • 类型为 const int ** const 的指针 cpptc 表示 **cpptccpptc 都为常量,不能用该指针修改所指一级指针指向的数据的值,可修改其所指一级指针的值,但不可修改其所指向的地址(指针自身的值),只能将 const int * 类型的一级指针地址、const int **const int ** const 类型的二级指针值赋给 cpptc,且必须在声明时初始化。
  • 类型为 const int *const* 的指针 pcptc 表示 **pcptc*pcptc 都为常量,不能用该指针修改所指一级指针指向的数据的值,也不可修改其所指一级指针的值,但可修改其所指向的地址(指针自身的值),能将 int *int * constconst int *const int * const类型的一级指针地址、const int **const int ** constint **int ** constint * const *int * const * constconst int * const *const int *const* const 类型的二级指针值赋给 pcptc

对于类型为 int ** 的常规指针,有以下特性:

  • 类型为 int ** 的指针 ppt 表示 **ppt*pptppt 都不为常量,能用该指针修改所指一级指针指向的数据的值,也可修改其所指一级指针的值,也可修改其所指向的地址(指针自身的值),只能将 int * 类型的一级指针地址赋给 ppt

各类型二级指针的可修改属性如下表所示:

指针类型 修改 **pt 修改 *pt 修改 pt
const int ** pt 不可以 可以 可以
int * const * pt 可以 不可以 可以
int ** const pt 可以 可以 不可以
int ** pt 可以 可以 可以
const int *const* const pt 不可以 不可以 不可以
int * const * const pt 可以 不可以 不可以
const int ** const pt 不可以 可以 不可以
const int * const * pt 不可以 不可以 可以

若将一级指针的地址赋予二级指针,各类型二级指针可接受的一级指针地址如下表所示:

指针类型 int *地址 const int *地址 int * const地址 const int * const地址
const int ** pt 不可以 可以 不可以 不可以
const int ** const pt 不可以 声明时可以 不可以 不可以
int ** pt 可以 不可以 不可以 不可以
int ** const pt 声明时可以 不可以 不可以 不可以
int * const * pt 可以 不可以 可以 不可以
int * const * const pt 声明时可以 不可以 声明时可以 不可以
const int * const * pt 可以 可以 可以 可以
const int *const* const pt 声明时可以 声明时可以 声明时可以 声明时可以

若将二级指针的值赋予二级指针,各类型二级指针可接受的二级指针值如下表所示:

指针类型 const int ** const int ** const int ** int ** const int * const * int * const * const const int * const * const int *const* const
const int ** pt 可以 可以 不可以 不可以 不可以 不可以 不可以 不可以
const int ** const pt 声明时可以 声明时可以 不可以 不可以 不可以 不可以 不可以 不可以
int ** pt 不可以 不可以 可以 可以 不可以 不可以 不可以 不可以
int ** const pt 不可以 不可以 声明时可以 声明时可以 不可以 不可以 不可以 不可以
int * const * pt 不可以 不可以 可以 可以 可以 可以 不可以 不可以
int * const * const pt 不可以 不可以 声明时可以 声明时可以 声明时可以 声明时可以 不可以 不可以
const int * const * pt 可以 可以 可以 可以 可以 可以 可以 可以
const int *const* const pt 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以

C++ 二级指针与 const 关键字的更多相关文章

  1. Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符

    在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...

  2. const关键字与数组、指针

    目录 const关键字 const修饰数组 const修饰指针 用两个const修饰指针 @ 开始回顾C基础知识.C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就 ...

  3. 实习第一个月总结(const关键字、条件编译、volatile关键字、#和##的作用、函数指针)

    C语言中const关键字的作用: 修饰局部变量或者全局变量,表示变量n的值不能被改变了 修饰指针,分为常量指针与指针常量,也可以两者结合 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变, ...

  4. 深入聊一下const关键字

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助. 1.c ...

  5. 对线程等待函数pthread_join二级指针参数分析

    分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...

  6. C++中const关键字的使用总结

    C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中 ...

  7. 指针与const

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

  8. (转) C/C++中const关键字详解

    文章转自  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...

  9. C语言中Static和Const关键字的的作用

    程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块 ...

随机推荐

  1. 一个思维导图,带你深入理解 Linux 网络

    说明 思维导图 目录 内核接收网络包 内核与用户进程协作 内核发送网络包 TCP 连接 网络性能优化 GitHub 项目 说明 经朋友推荐发现一本好书:<深入理解 Linux 网络>,本文 ...

  2. Oracle oci python sdk简单使用

    听说Oracle有个oracle always free计划,所以赶紧申请了个Oracle Cloud的账号,主要是用来FQ用的,之前用过Google的,不过只有1年的期限,由此看来这个很吸引人,搭建 ...

  3. 安装linux下一些常用软件

    1.先卸载一些不常用的软件 apt purge ufw lxd lxd-client lxcfs lxc-common 2.安装一些常用软件 apt install iproute2 ntpdate ...

  4. 多校B层冲刺NOIP20211110 字符配对游戏

    原题 问题描述 操场边,运动会没有项目的同学也没闲着,经过几天的研究,他们发明了一个很有意思的字符串配对游戏,两位同学准备两张白纸,第一个同学在纸上写一个整数N和一个由小写字母组成的字符串S,将S重复 ...

  5. 从零开始在centos搭建博客(二)

    本篇为备份篇. 因为装的东西不多,所以需要备份的只有mysql和wordpress的文件夹. 备份mysql mysql备份命令 使用mysqldump命令,格式如下: # 这是格式 mysqldum ...

  6. 教你PC端网易云音乐自定义代理,VIP免费听歌!

    今天分享一份福利吧,使用网易云音乐自定义代理实现免费听和下载VIP.极高音质.付费的歌曲,这里主要针对PC端电脑版的,需要自己写脚本运行. 01 安装node.js Node.js是一个让 JavaS ...

  7. 20220723-Mac上使用IntelliJ IDEA

    目录 IDEA快捷键 IDEA模板 常用模板快捷键 个人随笔 软件:IntelliJ IDEA 电脑:Mac IDEA快捷键 打开/关闭 项目视图 快捷键:⌘ + 1 运行项目 快捷键:⌃ + ⇧ + ...

  8. ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器

    通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件.对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的." ...

  9. eclipse mave无法下载jar包

    解决方法: 先查看本地配置是否正确: 确保此处没有勾选 此处和自己配置的maven一致,没有则修改此处设置.然后项目上右键–>Maven–>Update Project 即可 . 如果还不 ...

  10. Java中list集合自定义排序-2022新项目

    一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...