zoukankan      html  css  js  c++  java
  • 指针和Const限定符

    指针和Const限定符

    1.指向const对象的指针

      如果指针指向的是const对象,则不允许使用指针来改变其所指的const值。C++要求指向const对象的指针具有const特性

    const double *cptr;                 //cptr是一个指向double类型const对象的指针。

           此处const限定了cptr指针所指向的对象类型,而非cptr本身。即cptr本身并不是const。在定义时,不需要对它进行初始化,若需要,可使cptr指向另一个const对象,但不允许使用cptr来改变所指向对象的值       

    *cptr = 30; //error

      1)把一个const对象的地址赋给const对象的指针会导致编译时错误:

    const double Pi=3.14;
    double *ptr = Π             //error
    const double *cptr = Π      //ok

      2)不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址:

    const int universe = 42;
    const void *cpv = &universe;      //ok
    void *pv = &universe;             //error

      3)允许把const对象的地址赋值给指向const对象的指针

    double dval = 3;
    cptr = &dval;

       虽然dval不是const对象,但任何企图通过指针cptr修改其值的行为均会导致编译错误。指向const对象的指针一经定义,就不允许修改其所指对象(const对象和非const对象)的值。若指向const对象的指针所指的对象是非const对象,可以使用其他方法更改其值:

    dval = 3.1415926;
    *cptr = 3.1415926;        //error
    cptr = &dval;
    double *ptr = &dval;
    *ptr = 2.72;
    cout << *cptr;        //输出2.72

      故:不能保证指向const对象的指针所指对象的值一定不可以修改。

       在实际的应用中,指向const对象的指针常用作函数的形参,以确保传递给函数的实际对象在函数中不因形参的改变而被修改。

    2.const指针

      const指针:是指该指针不可改变。

    int errNumb = 0;
    int *const curErr = &errNumb;

      可从右向左将上述定义读作“curErr是指向int型对象的const指针”。这意味着不能使curErr指向其他对象,任何试图给curErr赋值的操作均会导致编译错误。

    curErr = curErr;    //error

      与任何const量一样,const指针必须在定义时初始化。

      指针本身是const的事实并没有说明是否能使用该指针修改它所指对象的值。指针所指对象的值能否修改完全取决于该对象的类型。即该指针是const并不代表就不能修改其所指对象的值。如果const指针指向const对象,那么就可以使用该指针修改所指对象的值:

    int e=9;
    int *const p=&e;
    *p=6;

    这样,e的值被修改为6。

    3.指向const对象的const指针

      还有一种指向const对象的const指针

    const double pi = 3.1415926;
    const double *const pi_ptr = &pi;

      上例中,即不能修改pi_ptr所指对象的值,也不允许修改指针的指向(即pi_ptr中存放的地址值)。可从右向左将上述定义读作“pi_ptr首先是一个const指针,指向double类型的const对象”。

  • 相关阅读:
    postman自动化测试断言
    sqlserver 数据库查询 数据库连接情况和 什么语句造成死锁
    asp.net core 中async/await
    2019年4月15日 查询功能1
    2019年3月21日 装饰器进阶2-带参数的装饰器
    2019年3月10日 装饰器进阶-模拟session
    2019年3月9日 解压序列
    2019年2月24日 装饰器基本实现
    2019年2月23日 装饰器1:高阶函数,函数嵌套
    2019年2月3日 装饰器,小年夜
  • 原文地址:https://www.cnblogs.com/whl2012/p/3614730.html
Copyright © 2011-2022 走看看