const指针和指向const对象的指针

来源:互联网 发布:linux虚拟存储器系统 编辑:程序博客网 时间:2024/05/18 00:02

在C++中,带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 = π // okdouble *p = &a; // error

不能使用void*指针来保存const对象的地址,而需要用const void*类型的指针来保存:

const double pi = 3.14;const void *vp = &pi  // okvoid *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;      // okpi = 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;


0 0