const指针和指向const对象的指针
2014-01-16 15:16
267 查看
在C++中,带const修饰符的指针很容易混淆,做个总结:
不能将一个const对象的指针赋给非const对象的指针,例如下面的代码会导致编译错误:
不能使用void*指针来保存const对象的地址,而需要用const void*类型的指针来保存:
允许将非const对象的抵制赋给指向const对象的指针,例如:
但是无法通过指针p来修改pi的值:
即指向const对象的指针实际上既可以指向const对象,也可以指向非const对象,但是都无法通过该指针来改变指向对象的值,可以直接给该对象赋值或者用其它的非const指针来改变对象的值:
所以,指向const对象的指针具有如下特性:
定义时不需要进行初始化,例如const double *cptr;
指针本身可以指向其它的对象,但是不能通过该指针修改其指向的值
不能将一个const对象的地址赋给非const对象的指针
const对象的地址可以用const void* 类型的指针来保存
指向const对象的指针也可以指向非const对象,但是无法通过该指针来改变指向对象的值,可以采用直接给指向对象赋值或者间接利用普通的非const指针来修改对象的值
在实际使用中,通常将指向const对象的指针用作函数的行参,以此确保传递给函数的实际对象在函数中不因为行参而被改变。
则curErr是指向int对象的const指针,与其它const对象一样,const指针也需要在定义的时候初始化,它自身的值也不可以改变(不可以再指向其它对象),但是const指针所指向的对象的值是否可以改变则完全取决于所指对象的类型,例如如上定义的errNum就可以修改值:
其中const对象a的值无法改变,const指针p的值也无法改变。
该语句的含义是指向string类型的const指针,等价于:
1. 指向const对象的指针
由于const对象的值不可以修改,所以不允许通过指针来改变其指向的const值,例如如下定义:const double *cptr;这里cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而非cptr本身。也就是说,cptr本身并不是const,在定义时不需要对它进行初始化,同时允许对cptr重新赋值,使其指向另外一个const double对象。但是不能够通过cptr修改其所指对象的值。
不能将一个const对象的指针赋给非const对象的指针,例如下面的代码会导致编译错误:
const double pi = 3.14; const double *cp = π // ok double *p = &a; // error
不能使用void*指针来保存const对象的地址,而需要用const void*类型的指针来保存:
const double pi = 3.14; const void *vp = &pi // ok void *p = π // error
允许将非const对象的抵制赋给指向const对象的指针,例如:
double pi = 3.14; const double *cp = π // ok
但是无法通过指针p来修改pi的值:
*p = 3.0; // error
即指向const对象的指针实际上既可以指向const对象,也可以指向非const对象,但是都无法通过该指针来改变指向对象的值,可以直接给该对象赋值或者用其它的非const指针来改变对象的值:
double pi = 3.14; const double *cp = π dobule *p = π *cp = 3.0; // error *p = 3.0; // ok pi = 3.0; // ok
所以,指向const对象的指针具有如下特性:
定义时不需要进行初始化,例如const double *cptr;
指针本身可以指向其它的对象,但是不能通过该指针修改其指向的值
不能将一个const对象的地址赋给非const对象的指针
const对象的地址可以用const void* 类型的指针来保存
指向const对象的指针也可以指向非const对象,但是无法通过该指针来改变指向对象的值,可以采用直接给指向对象赋值或者间接利用普通的非const指针来修改对象的值
在实际使用中,通常将指向const对象的指针用作函数的行参,以此确保传递给函数的实际对象在函数中不因为行参而被改变。
2. const指针
const指针指的是本身被const修饰的指针,即本身的值不可以修改,它的定义如下:int errNum = 0; int const* curErr = &errNum;
则curErr是指向int对象的const指针,与其它const对象一样,const指针也需要在定义的时候初始化,它自身的值也不可以改变(不可以再指向其它对象),但是const指针所指向的对象的值是否可以改变则完全取决于所指对象的类型,例如如上定义的errNum就可以修改值:
*curErr = -1;
3. 指向const对象的const指针
如下定义指向const对象的const指针:const int a = 0; const int *const p = &a;
其中const对象a的值无法改变,const指针p的值也无法改变。
4. 指针和typedef
参考如下语句:typedef string *pstring; const pstring cstr;
该语句的含义是指向string类型的const指针,等价于:
string *const cstr;
相关文章推荐
- 指向const对象的指针 const指针
- const指针和指向const对象的指针
- 指向const对象的指针 const指针
- “指向const对象的指针” 和 “const指针”
- 指向const对象的指针和const指针小结
- 指向const对象的指针 和 const指针
- c++ const指针和指向const对象的指针
- “指向const对象的指针” 和 “const指针”
- C++指向const对象的指针和const指针
- “指向const对象的指针”和“const指针”
- C++中的指向const对象的指针、const指针、指向const对象的const指针
- 指向const对象的指针与const指针
- C++ 指向const对象的指针和const指针
- [转]指向const对象的指针和const指针
- 指向const对象的指针和const指针
- 指向const对象的指针和const指针
- 指向const对象的指针和const指针
- (转)const和指针(指向const对象的指针、const指针)
- 关于const指针和指向const对象的指针的初始化问题
- [转载]如何区分“指向const对象的指针”和“const指针”?