可用七种不同的方式将 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. Codeforces Round #790 (Div. 4) A-H

    Codeforces Round #790 (Div. 4) A-H A 题目 https://codeforces.com/contest/1676/problem/A 题解 思路 知识点:模拟. ...

  2. labview从入门到出家3--制作和调用子VI

    当程序越写越大的时候,我们会发现代码界面会比较乱(线太多),那要怎么做可以让代码更简洁一点,我只管直接调用某个功能函数,而不需要在一个VI上面去实现这个功能函数呢?--子VI.好比C语言里面的Main ...

  3. Cisco Packet Tracer Student(思科网络模拟器)模拟搭建VLAN网络

    一.VLAN简介 VLAN指在同一个物理网段内,通过逻辑手段,将其划分出多个虚拟的局域网,每个虚拟局域网都具备和真实局域网一样的功能.VLAN不受物理位置限制,可以灵活划分,同一个VLAN内的主机之间 ...

  4. GitHub相关资料&&可以参加的开源项目

    GitHub相关的资料 有不懂的地方时可以看GitHub Docs. GitHub tutorial GitHub glossary GitHub的字典,可以看到里面特定的概念. All about ...

  5. 渗透测试(PenTest)基础指南

    什么是渗透测试? 渗透测试(Penetration Test,简称为 PenTest),是指通过尝试利用漏洞攻击来评估IT基础设施的安全性.这些漏洞可能存在于操作系统.服务和应用程序的缺陷.不当配置或 ...

  6. ESXI启用本地登录和SSH服务连接功能,使用Xshell连接

    1.选中Troubleshoot Options进行SSH服务配置 2.开启本地登录功能 3.开启远程连接功能 4.本地登录修改SSH服务允许基于密码登录 默认无法用密码登录ssh服务,只支持基于ke ...

  7. fpga中的存储器

    fpga中的存储器三种:RAM,ROM,FIFO. RAM和ROM已经比较熟悉了,记录一下FIFO. FIFO:first in first out ,顺序存取,先入先出.是一种数据缓存器,用来作不同 ...

  8. 【每天学一点-01】 在SpringBoot项目中使用Swagger2

    今天在做毕设的时候,发现在前后端分离的情况下,去调用接口数据时很不方便,然后回想过去,和同学一起做项目的时候,他负责后端,我负责前端,当时调用他的弄好的接口可以说是非常方便,主要是可以通过UI页面直接 ...

  9. Go语言基础三:基本数据类型和运算符

    Go语言数据类型 与其他编程语言一样,Go语言提供了各种数据类型,可分为基本的数据类型和复杂的数据类型.基本的数据类型就是基本的构造块,例如字符串.数字和布尔值.复杂的数据类型是用户自己定义的结构,由 ...

  10. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...