C++基础---指针与const

1. 指针与const

1.1 常量指针

  • 常量指针:指该指针不可改变,就是该指针保存的内存地址不可被重新赋值
  • 定义形式:数据类型 *const 变量名;

    如:int *const p = new int; //定义了一个常量指针p
    
    #include <iostream>
    
    using namespace std;
    class A 
    {
    public:
        int get()const
        {
            return i;
        }
        void set(int x)
        {
            i = x;
        }
    private:
        int i;
    };
    int main()
    {
        A *p = new A;
        cout<<"指针p指向的内存地址:"<<p<<endl;
        p++;
        cout<<"指针p偏移1个单位后,指向的内存地址:"<<p<<endl;
    
        A *const p1 = new A;
        cout<<"指针p1指向的内存地址:"<<p1<<endl;
        //p1++;//编译报错error C3892: “p1”: 不能给常量赋值
        cout<<"由于p1被定义为常量指针,不能给常量赋值:"<<p1<<endl;
    
        system("pause");
        return 0;
    }
    =>指针p指向的内存地址:00E34750
      指针p偏移1个单位后,指向的内存地址:00E34754
      指针p1指向的内存地址:00E347E0
      由于p1被定义为常量指针,不能给常量赋值:00E347E0

    注:p++; p- -; p=p1; 等对常量重新赋值的操作都是错误的,由于p是常量指针,不能修改指针保存的地址,因此企图修改常量指针保存的地址值将会报错。

1.2 指向常量的指针

  • 指向常量的指针:指该指针指向的内存地址中的值不可改变
  • 定义形式:const 数据类型 *变量名;

    如:const int *p = new int; //定义了一个指向常量的指针p
    
    #include <iostream>
    
    using namespace std;
    class A 
    {
    public:
        int get()const
        {
            return i;
        }
        void set(int x)
        {
            i = x;
        }
    private:
        int i;
    };
    int main()
    {
        A *p = new A;
        p->set(22);
        cout<<"p指针指向的内存地址中的值改变后:p->get() = "<<p->get()<<endl;
    
        const A *p1 = new A;
        //p1->set(22);//编译报错,error C2662: “A::set”: 不能将“this”指针从“const A”转换为“A &”
        cout<<"p1是指向常量的指针,该指针指向的内存地址中的值不可改变"<<endl;
    
        system("pause");
        return 0;
    }
    =>p指针指向的内存地址中的值改变后:p->get() = 22
      p1是指向常量的指针,该指针指向的内存地址中的值不可改变

    注:*p = 1;等重新对指针指向的内存空间中的数据重新赋值都是错误的,由于p是指向常量的指针,该指针指向的内存地址中的值不可改变,因此企图修改指向常量的指针中保存地址处的值时将会报错。

1.3 指向常量的常指针

  • 指向常量的常指针:指该指针不可改变,就是该指针保存的内存地址不可被重新赋值。同时,指该指针指向的内存地址中的值不可改变
  • 定义形式:const 数据类型 *const 变量名;

    如:const int* const p = new int; //定义了一个指向常量的常指针p
    
    #include <iostream>
    
    using namespace std;
    class A 
    {
    public:
        int get()const
        {
            return i;
        }
        void set(int x)
        {
            i = x;
        }
    private:
        int i;
    };
    int main()
    {
        A *p = new A;
        cout<<"指针p指向的内存地址:"<<p<<endl;
        p++;
        cout<<"指针p偏移1个单位后,指向的内存地址:"<<p<<endl;
        p->set(22);
        cout<<"p指针指向的内存地址中的值改变后:p->get() = "<<p->get()<<endl;
    
        const A *const p1 = new A;
        cout<<"指针p1指向的内存地址:"<<p1<<endl;
        //p1++;//编译报错error C3892: “p1”: 不能给常量赋值
        cout<<"由于p1被定义为常量指针,不能给常量赋值:"<<p1<<endl;
        //p1->set(22);//编译报错,error C2662: “A::set”: 不能将“this”指针从“const A”转换为“A &”
        cout<<"p1是指向常量的指针,该指针指向的内存地址中的值不可改变"<<endl;
    
        system("pause");
        return 0;
    }
    =>指针p指向的内存地址:007D4750
      指针p偏移1个单位后,指向的内存地址:007D4754
      p指针指向的内存地址中的值改变后:p->get() = 22
      指针p1指向的内存地址:007D47E0
      由于p1被定义为常量指针,不能给常量赋值:007D47E0
      p1是指向常量的指针,该指针指向的内存地址中的值不可改变

    注:
    (1)p++; p- -; p=p1; 等对常量重新赋值的操作都是错误的,由于p是常量指针,不能修改指针保存的地址,因此企图修改常量指针保存的地址值将会报错。
    (2)*p = 1;等重新对指针指向的内存空间中的数据重新赋值都是错误的,由于p是指向常量的指针,该指针指向的内存地址中的值不可改变,因此企图修改指向常量的指针中保存地址处的值时将会报错。


参考文献 :
[1]《C++全方位学习》范磊——第八章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3] 百度搜索关键字:C++指针、常量指针、指向常量的指针、指向常量的常指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值