const 与指针的组合区分

本文详细解释了const与指针的组合,区分了指向常量的指针(const*)与常量指针(*const),并通过实例展示了它们在内存操作中的限制。同时介绍了const修饰智能指针的情况,强调了const限定对内容而非指针本身的约束。
摘要由CSDN通过智能技术生成

const 与指针的组合区分

1 三个好基友

const int* , int const * , int* const

前两个都是一个意思:指向整型常量的指针

最后一个是:常量指针

1.1 记忆方式

​ const 在 *的左右还是右边。

  • 如果const的左边是类型,那么说明,这个类型值是不能动的,即,这是指向一个不能动的值(常量)的指针。所以int const * p1是一个指向整型常量的指针。

  • 如果const的左边是*,那么说明,这个指针是不能动的(*意味着指针嘛),即,这是一个不能动的指针(常量指针)。所以int * const p2是一个指向整型的常量指针。

1.2 练习

  • const int*

    不能通过指针修改变量值

    int x = 12;
    const int *p1 = &x;
    cout << "p1 " << *p1 << endl;   // 12
    x = 20;
    cout << "p1 " << *p1 << endl;  // 20
    int y = 30;
    p1 = &y;
    cout << "p1 " << *p1 << endl;  // 30
    *p1 = *p1 + 1;  // 报错
    
  • int* const

    指向的地址不能改变,也就是常量指针

    int x = 12;
    int z = 40;
    int* const p2 = &z;
    p2 = &x;  // 报错
    

1.3 参考博客

const int *p 和int const *p和int * const p,总有人搞不懂,对吧_AYZP的博客-CSDN博客

2 const 与智能指针

2.1 const shared_ptr

  • 练习

        const auto ptr = make_shared<int>(10);
        *ptr += 1;  // 10 + 1 = 11
        ptr++;  // 报错
        ptr = make_shared<int>(20);  // 报错
    
  • 总结

    指针指向的内容可以修改,但是指针地址不能修改,就是说const 针对的是最外层(指针)。 const 修饰的是指针。

2.2 shared_ptr

  • 练习

    auto ptr1 = make_shared<const int>(100);
    cout << *ptr1 << endl;
    // *ptr1 += 1;  // 报错
    ptr1 = make_shared<int>(10);  // 10
    cout << *ptr1 << endl;
    
    class A {
    public:
        void SetX(int x)
        {
            m_x = x;
        }
        int GetX() const
        {
            return m_x;
        }
    private:
        int m_x {0};
    };
    
    auto ptr = make_shared<const A>();
    // ptr->SetX(10);  // 报错
    ptr->GetX();  // 注意:GetX() 必须要加const限定
    
  • 总结

    该const 限定的是内容,内容不能被修改,注意如果是类的指针指针,不能调用类的非const成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值