写点什么

C++ const 与指针

作者:ycwang
  • 2023-01-29
    广东
  • 本文字数:846 字

    阅读完需:约 3 分钟

写 C++代码时,有时看到类似这样的代码,会愣一下、想一想它们到底是在说什么:


  int val = 10;   const int* pA = &val; // Or: int const* pA  int* const pB = &val;   const int* const pC = &val;
复制代码


因此,做个笔记,把 const 修饰符和指针混用的情况整理一下,加深理解。


如下这个语句:


  const int* pA = &val; // Or: int const* pA
复制代码


const 限定的是 int,称为:指向常量的指针, 也称为:常量指针。即:


  1. 指针本身可变,可以指向别的地址,例如:pA = &valB;

  2. 指针指向的内容是常量,不能通过指针来修改内容,*pA = 11 是非法的。


但如上的例子,可以通过访问 val 本身来修改内容,指针就无能为力了。


所以,指向常量的指针这么使用:


  int valA = 10;   int valB = 20;  const int* pA;   pA = &valA;  // pA can be modified to other address  pA = &valB;  // Compiling error, cannot modify the value pointed by pA  //*pA = 11;  // While we can modify the value directly, bypass pointer  valA = 11;
复制代码


它的英文名称,感觉比常量指针这个翻译更容易理解:Pointer to const


接下来一行代码:


  int* const pB = &val; 
复制代码


这种指针称为:指针常量,英文名称:Const Pointer。即:


  1. 指针本身是常量,必须初始化。而且初始化之后,不允许再指向别的地址;

  2. 指针指向的内容,不受 const 约束。


所以,指针常量这么使用:


  int valA = 10;   int valB = 20;   // const pointer must be initialized  int* const pB = &valA;   // Compiling, cannot modify the pointer itself  //pB = &valB;  // While we can modify the value pointed by the pointer  *pB = 11; 
复制代码




这两种指针长得这么像,如何区分呢?我个人的经验,就看 const 与*的相对位置。


  1. 如果 const 在*的左边,那么就是 Pointer to const,限定指向的内容;

  2. 如果 const 在*的右边,那么就是 Const Pointer,限定指针本身。

  3. 如果 const 在*的左边、右边都存在,那么就是 Const Pointer to const。不管是指针本身、还是指针指向的内容,都被 const 限定。




汇总成一张表格:





用户头像

ycwang

关注

还未添加个人签名 2018-11-13 加入

还未添加个人简介

评论

发布
暂无评论
C++ const与指针_c++_ycwang_InfoQ写作社区