简单理解const是锁还是不锁!

339 阅读2分钟
  1. 问题由来
    某天自我感觉良好的我,在QQ群发现大佬们的聊天东西,看了一下没怎么在意,仔细一看这都是什么啊一大坨,关键是我还不会,岂可休,就有了这篇文章!
 // 这是是大佬发的东西。
 // 这些const到底是指针不可修改,还是指针指向内存中存储的值不可修改?  
 const int p;
 const int *p;
 int const* p;
 int * const p;
 const int * const p;
 int const * const p;
  1. 结论
    通过一些实践和网上索搜来的资料,得到以下结论:

*操作符在const左边,那么锁指针,不锁指针值
*操作符在const右边,那么锁指针值,不锁指针
*操作符的左右都有const,那么锁指针、指针值

  1. 实践
  #include <iostream>
  using namespace std;

  int main(){

    int a = 30, b = 40;
    
    // Test 1:
    const int p = a;        // 这里p单纯是一个常量,值不可修改。
    cout<<p<<endl;          // 30
    // p = b;               // p只读不可修改

    // Test 2:
    const int *p = &a;      // 这里*在const右边,那么是锁值,不锁指针。
    cout<<*p<<endl;         // 30;
    p = &b;             
    cout<<*p<<endl;         // 40;
    //  *p = 55;            // p只读不可修改

    // Test 3:
    int const *p = &a;      // 同样在右边
    cout<<*p<<endl;         // 30;
    p = &b;             
    cout<<*p<<endl;         // 40;
    //  *p = 55;            // p只读不可修改

    // Test 4:
    int * const p = &a;     // *在const左边,锁指针不锁值
    cout<<*p<<endl;         // 30;
    *p = 55;                
    cout<<*p<<endl;         // 55;
    // p = &b;              // p只读不可修改

    // Test 5:
    /*
      锁值锁指针,从第一个const来看*操作符在右边,那么锁值不锁指针,从第二个const来看*操作符在左边,那么锁指针不锁值,两者合并,指针和值都不可修改。
    */
    const int * const p = &a;
    cout<<*p<<endl;         // 30;
    // p = &b;              // p只读不可修改
    // *p = 55;             // p只读不可修改

    // Test 6:
    /*
      同上锁值锁指针,从第一个个const来看*在右边锁值,第二个const来看*在左边,锁指针。
    */
    int const * const p = &a;
    cout<<*p<<endl;         // 30;
    // p = &b;              // p只读不可修改
    // *p = 55;             // p只读不可修改

    return 0;
  };

搞明白指针,真的很重要o,借用大佬的话,这些都是基础啊,哭泣脸。
从上面的例子来看,目前来说结论是没问题的,真希望自己以后也能有与群里大佬谈笑风生的时候😂。
ps: 博主还是新手村打B的小萌新,如果文章有误请指出,谢谢。