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声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块 ...
随机推荐
- IP寻址与规划
一.IP寻址和子网划分 IP地址的主机部分可被分为三种地址:网络地址.主机地址和定向广播地址. 网络地址是网络号中的第一个地址.它用来将网络内的其他所有网段唯一标识为一个网段或广播域.定向广播地址是网 ...
- 利用IDEA搭建SpringBoot项目,整合mybatis
一.配置文件.启动项目 生成之后这几个文件可以删掉的 配置application spring.datasource.url=jdbc:mysql://localhost:3306/test?serv ...
- HDFS数据平衡
一.datanode之间的数据平衡 1.1.介绍 Hadoop 分布式文件系统(Hadoop Distributed FilSystem),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件 ...
- Kotlin学习快速入门(7)——扩展的妙用
原文地址: Kotlin学习快速入门(7)--扩展的妙用 - Stars-One的杂货小窝 之前也模模糊糊地在用这个功能,也是十分方便,可以不用继承,快速给某个类增加新的方法,本篇便是来讲解下Kotl ...
- PTA(BasicLevel)-1013 数素数
一.问题描述 令 Pi 表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数. 输出格式:输入在一行中给出 M 和 N,其间以空格分隔. 输 ...
- Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
编辑完 ip地址,要重启网络 sudo service network restart 结果返回错误,错误如下 Restarting network (via systemctl): Job for ...
- Leetcode 1331. 数组序号转换
给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号. 序号代表了一个元素有多大.序号编号的规则如下: 序号从 1 开始编号. 一个元素越大,那么序号越大.如果两个元素相等,那么它 ...
- ROS机械臂 Movelt 学习笔记1 | 基础准备
环境:Ubuntu18.04 + ROS Melodic 1. 安装ROS 官网下载安装步骤:http://wiki.ros.org/melodic/Installation/Ubuntu 一键安装的 ...
- 作业一、安装Ubuntu系统
Ubuntu1804安装 一.安装环境 1.VMware Workstation 16 Pro 2.Ubuntu 18.04.6 LTS 二.部署系统 步骤1.进入VMware,点击创建新的虚拟机 步 ...
- java------常见的进制、不同进制在代码中的表现形式、进制之间的转化、分辨率、三原色、计算机的存储规则
常见的进制: 常见的进制:二进制.八进制.十进制.十六进制 不同进制在代码中的表现形式: 进制之间的转化: 二进制转十进制: 普通方法: 快捷方法: 八进制转十进制: 十六进制转十进制: 总结: 分辨 ...