C++ 二级指针与 const 关键字
2024-09-08 19:08:25
可用七种不同的方式将 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 |
声明时可以 | 声明时可以 | 声明时可以 | 声明时可以 | 声明时可以 | 声明时可以 | 声明时可以 | 声明时可以 |
最新文章
- QC在win7下不能访问QC服务器介绍
- react+redux官方实例TODO从最简单的入门(3)-- 删
- Got the Best Employee of the year 2015 Star Award
- quick3.5 removeFromParent()导致的windows下模拟器崩溃问题
- JAVA SSH 框架介绍
- Android 的系统架构
- dom paser
- 转载——PLSQL developer 连接不上64位Oracle 解决办法
- 287. Find the Duplicate Number
- javascript oo实现(转)
- Magento开发文档(一):Magento入门
- orcale同一条语句运行速度差异问题
- Android permission访问权限大全
- ajax 大洋与小样的第二步
- 我的Android手册
- DIV+CSS中的滤镜和模糊
- Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer错误解决办法
- 解决localdb中文智能的问题
- 【spring】task 任务调度(定时任务)
- iOS原生实现二维码拉近放大