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

在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 = π // 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;


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值