指针和const

将 const 用于指针有一些很微妙的地方,我们来详细探讨一下。可以用两种不同的方式将 const 关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止该指针来修改所指向的值。第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。下面来看看细节。

首先,我们声明一个指向常量的指针 pt :

int age = 39;

const int * pt = &age;

改声明指出,pt指向一个 const int,因此不能用 pt 来修改这个值。换句话说,*pt 的值为 const ,不能被修改:

*pt += 1; //错误

cin>> *pt; //错误

现在看一个很微秒的问题。pt 的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对 pt 而言,这个值是常量。例如,pt 指向 age ,而 age 不是 const 。可以直接通过 age 来修改 age 的值,但不能用指针 pt 来修改它:

*pt = 20; //错误

age = 20; //正确

以前我们将常规变量的地址赋给过常规指针;而现在又将常规变量的地址赋给了指向 const 的指针。因此还有两种可能:将 const 变量的地址赋给指向 const 的指针、将 const 的地址赋给常规指针。这两种操作都可行吗?第一种可行,但第二种不行。

const float g_earth = 9.80;

const float * pe = &g_earth; //正确

const float g_moon = 1.63;

float * pm = &g_moon; //错误

对于第一种情况来说,既不能使用 g_earth 来修改 9.80 的值,也不能使用 pe 来修改。C++禁止第二种情况的原因很简单——如果将 g_moon 的地址赋给 pm,则可以使用 pm 来修改 g_moon 的值,这使得 g_moon 的 const 状态很荒谬,因此C++禁止将 const 的地址赋给 非 const 指针。

如果将指针指向指针,则情况更复杂,前面已经讲过,假如涉及的是一级间接关系,则将非 const 指针赋给  const 指针是可以的:

int age = 39; //age++ 正确

int * pd = &age; //*pd++正确

const int * pt = pd; //*pt++错误

记住:如果数据类型本身并不是指针,则可以将 const 数据或非 const 数据的地址赋给指向 const 的指针,但只能将非 const 数据的地址赋给非 const 指针

尽可能使用 const

1.这样可以避免由于无意间修改数据而导致的编程错误。

2.使用 const 使得函数能够处理 const 和非 const 实参,否则将只能接受非 const 数据。

3.如果条件允许,则应将指针形参声明为指向 const 的指针。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值