指针和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对象”。

原文地址:https://www.cnblogs.com/whl2012/p/3614730.html