可用七种不同的方式将 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. Flink1.13.1源码解析-Application on yarn(一)

    本篇文章讲述 Flink Application On Yarn 提交模式下,从命令提交到 AM 容器创建 1.脚本入口 flink run-application -t yarn-applicati ...

  2. python实现人脸关键部位检测(附源码)

    人脸特征提取 本文主要使用dlib库中的人脸特征识别功能. dlib库使用68个特征点标注出人脸特征,通过对应序列的特征点,获得对应的脸部特征.下图展示了68个特征点.比如我们要提 取眼睛特征,获取3 ...

  3. NC25136 [USACO 2006 Ope B]Cows on a Leash

    NC25136 [USACO 2006 Ope B]Cows on a Leash 题目 题目描述 给定如图所示的若干个长条.你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其 ...

  4. JavaWEB-02-MySQL高级

    内容 约束 多表关系 一对一 一对多 多对多 多表联查 ==多表联查== 事务 1. 约束 1.1 概念 限制,在数据库中是对某一列(多列)进行限制. 对表中的数据进行限定,保证正确性.有效性.完整性 ...

  5. 记一道经典树上Nim游戏

    这道题首先是 Hanriver 提出来的,但是大家都不会做,今天看到了一道一模一样的题目 AT2667 题目大意是,每个人删掉一个不是整棵树的原树的子树,给定一个树问游戏状态. 首先,这是需要用到多个 ...

  6. rust实战系列-base64编码

    前言 某些只能使用ASCII字符的场景,往往需要传输非ASCII字符的数据,这时就需要一种编码可以将数据转换成ASCII字符,而base64编码就是其中一种. 编码原理很简单,将原始数据以3字节(24 ...

  7. linux 配置集群需要修改的东西

    1. 服务器主机名 vi /etc/hostname 按Esc,然后:wq! ,保存,然后重启电脑 reboot 2.修改IP和mac,也可以设置成自动的,但一般是固定的 cd /etc/syscon ...

  8. 2、MYSQL介绍

    一.mysql优点 1.成本低:开放源代码,一般可以免费试用,采用的是gpl协议 2.性能高:执行很快 3.简单:很容易安装和使用   二.DBMS分为两类: 1.基于共享文件系统的DBMS(Acce ...

  9. excel网络函数库之谷歌翻译

    不知道看到本篇文章的小伙伴是否被表格翻译所困扰,当面对大量需要被翻译的文件内容,有着三头六臂的孙悟空也难以招架得住,那么有没有一个工具能让我们快速将大量文件进行翻译呢? ExcelApi函数库的横空出 ...

  10. NOI / 1.2编程基础之变量定义、赋值及转换全题详解(5063字)

    目录 01:整型数据类型存储空间大小 02:浮点型数据类型存储空间大小