浅析指针与const

*   const用于指针有着一些微妙的地方,也有着比较复杂,短时间难以理解的地方,所以就此详细探讨一番。

  • 让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值
       
int age=39;
const int * pt = &age;

 *pt的值为const,对pt而言,这个值(age)是常量,但并不意味着它所指向的值就是一个常量,可以通过修改age变量来修改age的值。
  这是将常规变量赋给const指针,那么再仔细一想,还有两种情况:
①. 将const变量赋给const指针

const float pi = 3.14;
const float * p = π   //这显然有效

②. 将const变量赋给常规指针

const float pi =3.14;
float * pm= π   //无效

为什么第二种情况无效?
显然,将const变量赋给常规指针,则可以使用pm来修改pi的值,这使得pi的const状态很荒谬,因此C++禁止这种操作。若非这样做不可,那么可以使用强制类型转换…


  如果指针指向指针,那么情况将会更加复杂,例
 

const int  ** pp2;
int * p1;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;

上述将非const的地址(&pl)赋给const指针(pp2),而*pp2(p1)指向了n,因此可以使用pl来修改const数据,這显然是不合适的。在进入两级间接关系时,将const和非const混合的指针赋值方式是不安全的,所以仅当只有一层间接关系(指针指向基本数据类型)时,才可以将非const地址或指针赋给const指针。


常规指针不能指向const变量也意味着不能将const数组作为参数传递给使用非常量形参的函数,下述操作是不允许的:

const int num[5] = {1,2,3,4,5};
int sum(int arr[], int n){...}
int j = sum(num, 5);     //编译器将禁止这种函数调用

  • 将指针本身声明为常量,这样可以防止改变指针指向的位置
int age = 39;
int * const pt = &age;  //另一个微妙之处

关键字const的位置与以前有所不同,这种声明格式使得pt只能指向age,但允许使用pt修改age的值。

还可以声明指向const对象的cons指针:

double pi = 3.14;
const double * const pm = π

pm和*pm都是const。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值