const限定符和指针

1、指向const对象的指针;

指针指向const对象,但是指针本身是普通变量,可以修改和赋值。例如:

const  int   *   p;
这样定义效果和上面完全一样:

int  const * p;


 
这个指针p指向这样的对象:const int,也就是说,p指向的对象是不能修改的。 

*p = 23;//error: *p might be const

但是,指针p却是可以修改的:
const  int a=2;
const  int b=3;
p = &a;
p = &b;

还没完,虽然p是指向const对象的,但是这只是p自己认为自己是指向const对象的:

int  c = 4;
p = &c;//ok
*p = 4;//error

这里p指向的是普通对象,但是却不能修改p指向的值,因为p认为自己是指向const对象,是不能修改其值的。

在实际应用中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,可以确保传递给函数的实际对象在函数中不因为形参而被修改。

这才是重点。


但是,把一个const对象的地址赋值给一个普通的、非const对象的指针是错误的,这会导致编译时错误:

int  * q;
q = &a;// error!

2、不能使用void *指针保存const对象的地址,而必须使用const void * 类型的指针保存const对象的地址:

const  int   cu = 23;
const  void  * p = &cu;//ok
void * q = &cu;// error


3、const指针

上面是指针可变,但是指针指向的对象不能变。

还有一种情况是指针本身不能变--const指针。

    int e = 0;
    int * const p = &e;
可以这样理解:从右向左,p是指向int型对象的const指针。因为指针是const的,所以任何企图给const指针赋值的行为都导致编译时的错误:

p = p;// error, p is const
所以,必须在定义时初始化,否则以后就再也没有机会了(编译时报错:未初始化)。


但是,p指向的对象是普通的变量,可以修改:

*p = 45; //ok

4、更奇葩的:指向const对象的const指针:

const  double pi = 3.14159;
const  double * const  pi_ptr = π
这里,既不能修改指针pi_ptr的值,也不能修改指针pi_ptr指向的对象。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值