C++ 二级指针与 const 关键字

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

可用七种不同的方式将 const 关键字用于二级指针,如下所示:
  1. //方式一:所指一级指针指向的数据为常量,以下几种为等效表示
  2. const int ** pptc;    //方式一
  3. int const ** pptc;    //方式二
  4. //方式二:所指一级指针为常量
  5. int *const* pcpt;
  6. //方式三:二级指针本身为常量,需在声明时初始化
  7. int x = 55;
  8. int * pt = &x;
  9. int ** const cppt = &pt;
  10. //方式四:二级指针本身为常量,所指一级指针也为常量,所指一级指针指向的数据也为常量,需在声明时初始化
  11. int x = 55;
  12. const int * pt = &x;
  13. const int *const* const cpcptc = &pt;
  14. //方式五:二级指针本身为常量,所指一级指针也为常量,需在声明时初始化
  15. int x = 55;
  16. int * pt = &x;
  17. int *const* const cpcpt = &pt;
  18. //方式六:二级指针本身为常量,所指一级指针指向的数据也为常量,需在声明时初始化
  19. int x = 55;
  20. const int * pt = &x;
  21. const int ** const cpptc = &pt;
  22. //方式七:所指一级指针为常量,所指一级指针指向的数据也为常量
  23. int x = 55;
  24. const int * pt = &x;
  25. 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修改 ptconst 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声明时可以声明时可以声明时可以声明时可以声明时可以声明时可以声明时可以声明时可以
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表