今天看了《C++ Primer》4.2.5节“指针和const限定符”。觉得理解起来像绕口令似的,好不容易捋顺一遍,一做题,又乱了。做
点笔记,供参考。
1、指向const对象的指针
(1)我们可以用指针来修改其所指对象的值。
(2)如果,某指针指向const对象,则不允许用指针来改变其所指的const值。
(3)C++为保证这个特性,强制要求指向const对象的指针也必须具有const特性。
example:
const double *cptr;
(1)这里,cptr是一个指向double类型const对象的指针。
(2)const限定了cptr指针所指向的对象,而并非cptr本身。即cptr本身并不是const类型。在定义时不需要对它进行初
始化,允许给cptr重新赋值,使其指向另一个const对象。
(3)不能通过cptr修改其所指对象的值。
注意1:把一个const对象的地址赋给一个普通的、非const对象的指针也会导致编译时的错误。
example:
const double pi=3.14;
double *ptr=π //error:ptr is a plain pointer
const double *cptr=π //ok:cptr is a pointer to const
注意2:不能使用void*指针保存const对象的地址,而必须使用 const void*类型的指针保存const对象的地址。
example:
const int universe=42;
const void *cpv=&universe; //ok:cpv is const
void *pv=&universe; //error:universe is const
注意3:允许把非const对象的地址赋给指向const对象的指针
example:
double dval=3.14; //dval is a double ;its value can be changed
cptr=&dval; //ok:but can not change dval through cptr
尽管dval不是const对象,但任何企图通过指针cptr修改其值的行为都会导致编译时错误。cptr一经定义,就不允许修改
其所指向对象的值。
2、const指针
const指针---本身的值不能修改。
int errNumb=0;
int *const curErr=&errNumb; //curErr is a constant pointer
注:curErr是指向int型对象的const指针。与其他const量一样,const指针的值不能修改,这就意味着不能使curErr指
向其他对象。
与任何const量一样,const指针也必须在定义时初始化。
指针本身是const的事实--并没有说明--是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决
于该对象的类型。
3、指向const对象的const指针
example:
const double pi=3.14;
const double *const pi_ptr=π
本例子中,既不能修改pi_ptr所指向对象的值,也不能修改该指针的指向(即pi_ptr中存放的地址值)。
pi_ptr首先是一个const指针,指向double类型的const对象。
4、指针和typedef
typedef string *pstring;
cosnt pstring cstr;
问:cstr变量是什么类型?
答:把cstr定义为指向string类型对象的const指针
这个定义等价于string *const cstr;