• 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 ** 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 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以 声明时可以
  • 相关阅读:
    zabbix二级目录反代部署
    晚上下班之后做副业做什么好呢?
    【STL】bitset的模拟实现
    Repoptimizer论文理解与代码分析
    如何提升网站运营效率
    蓝桥杯-回文日期[Java]
    原码、反码、补码(8位二进制数)
    【[SCOI2005] 互不侵犯】【状压DP(含概念讲解)】
    DHorse v1.4.0 发布,基于 k8s 的发布平台
    Electron-Vue创建项目及踩坑记录
  • 原文地址:https://www.cnblogs.com/young520/p/16690816.html