C++ 二级指针与 const 关键字
可用七种不同的方式将 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 ** const、int * const *或int * const * const类型的二级指针值赋给pcpt。 - 类型为
int ** const的指针cppt表示cppt为常量,能用该指针修改所指一级指针指向的数据的值,也可修改其所指一级指针的值,但不可修改其所指向的地址(指针自身的值),只能将int *类型的一级指针地址、int **或int ** const类型的二级指针值赋给cppt,且必须在声明时初始化。 - 类型为
const int *const* const的指针cpcptc表示**cpcptc、*cpcptc和cpcptc都为常量,不能用该指针修改所指一级指针指向的数据的值,不可修改其所指一级指针的值,也不可修改其所指向的地址(指针自身的值),能将int *、int * const、const int *或const int * const类型的一级指针地址、const int **、const int ** const、int **、int ** const、int * const *、int * const * const、const int * const *或const int *const* const类型的二级指针值赋给cpcptc,且必须在声明时初始化。 - 类型为
int *const* const的指针cpcpt表示*cpcpt和cpcpt都为常量,能用该指针修改所指一级指针指向的数据的值,不可修改其所指一级指针的值,也不可修改其所指向的地址(指针自身的值),能将int *、int * const类型的一级指针地址、int **、int ** const、int * const *或int * const * const类型的二级指针值赋给cpcpt,且必须在声明时初始化。 - 类型为
const int ** const的指针cpptc表示**cpptc和cpptc都为常量,不能用该指针修改所指一级指针指向的数据的值,可修改其所指一级指针的值,但不可修改其所指向的地址(指针自身的值),只能将const int *类型的一级指针地址、const int **或const int ** const类型的二级指针值赋给cpptc,且必须在声明时初始化。 - 类型为
const int *const*的指针pcptc表示**pcptc和*pcptc都为常量,不能用该指针修改所指一级指针指向的数据的值,也不可修改其所指一级指针的值,但可修改其所指向的地址(指针自身的值),能将int *、int * const、const int *或const int * const类型的一级指针地址、const int **、const int ** const、int **、int ** const、int * const *、int * const * const、const int * const *或const int *const* const类型的二级指针值赋给pcptc。
对于类型为 int ** 的常规指针,有以下特性:
- 类型为
int **的指针ppt表示**ppt、*ppt和ppt都不为常量,能用该指针修改所指一级指针指向的数据的值,也可修改其所指一级指针的值,也可修改其所指向的地址(指针自身的值),只能将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 关键字的更多相关文章
- Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符
在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...
- const关键字与数组、指针
目录 const关键字 const修饰数组 const修饰指针 用两个const修饰指针 @ 开始回顾C基础知识.C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就 ...
- 实习第一个月总结(const关键字、条件编译、volatile关键字、#和##的作用、函数指针)
C语言中const关键字的作用: 修饰局部变量或者全局变量,表示变量n的值不能被改变了 修饰指针,分为常量指针与指针常量,也可以两者结合 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变, ...
- 深入聊一下const关键字
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助. 1.c ...
- 对线程等待函数pthread_join二级指针参数分析
分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...
- C++中const关键字的使用总结
C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中 ...
- 指针与const
指向常量的指针,不能用于改变其所指对象的值. 指针的类型必须与所指对象的类型一致,但是有两个例外,第一种是允许令一个指向常量的指针指向一个非常量对象: double dra1 = 3.14; cons ...
- (转) C/C++中const关键字详解
文章转自 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...
- C语言中Static和Const关键字的的作用
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块 ...
随机推荐
- jieba分词原理解析:用户词典如何优先于系统词典
目标 查看jieba分词组件源码,分析源码各个模块的功能,找到分词模块,实现能自定义分词字典,且优先级大于系统自带的字典等级,以医疗词语邻域词语为例. jieba分词地址:github地址:https ...
- Python-基础知识汇集
1.列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可 代码理解:列表 ...
- 使用vue实现排序算法演示动画
缘起 最近做的一个小需求涉及到排序,界面如下所示: 因为项目是使用vue的,所以实现方式很简单,视图部分不用管,本质上就是操作数组,代码如下: { // 上移 moveUp (i) { // 把位置i ...
- 毕业论文着急了?Python疫情数据分析,并做数据可视化展示
采集流程 一..明确需求 采集/确诊人数/新增人数 二.代码流程 四大步骤 发送请求 获取数据 网页源代码 解析数据 筛选一些我想用的数据 保存数据 保存成表格 做数据可视化分析 开始代码 1. 发送 ...
- LinkedList集合和Vector集合
LinkedList集合数据存储的结构是链表结构.方便元素添加.删除的集合.实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 LinkedList ...
- javaScript去重的11种方法
前言 去重是开发和面试中经常遇到的问题,下面是总结的 11 种去重方法 方法 示例数组 var arr = [1, 2, 4, 5, 5, 2, 1, 1, 4, 6] set + 解构赋值 这种方法 ...
- DeiT:注意力也能蒸馏
DeiT:注意力也能蒸馏 <Training data-efficient image transformers & distillation through attention> ...
- JavaScript进阶内容——jQuery
JavaScript进阶内容--jQuery 我们在前面的文章中已经掌握了JavaScript的全部内容,现在让我们了解一下JavaScript库 这篇文章主要是为了为大家大致讲解JavaScript ...
- 基于ABP实现DDD--实体创建和更新
本文主要介绍了通过构造函数和领域服务创建实体2种方式,后者多用于在创建实体时需要其它业务规则检测的场景.最后介绍了在应用服务层中如何进行实体的更新操作. 一.通过构造函数创建实体 假如Issue的 ...
- 2022-7-9 第五小组 潘堂智 html学习笔记
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...