指针和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_ptr所指对象的值,也不允许修改指针的指向(即pi_ptr中存放的地址值)。可从右向左将上述定义读作“pi_ptr首先是一个const指针,指向double类型的const对象”。