巧辨const的语义

原文: http://blog.youkuaiyun.com/rangzh/article/details/4666529 

C/C++中的const修饰符跟指针一起声明时,经常容易搞混淆。而这是几乎所有的面试都会考到的。其实要辨别const到底修饰的是什么,只需要巧妙地分析变量的声明即可。下面是简单的总结。

 

基本原则:const只限定从const开始向右直到变量名的部分。

也就是说,在分析声明语句时,找到const的位置,然后向右变量名前面的*的个数。假定有n个*,那么const修饰的内容就是 (*...*变量名).

 

例1. const int *p

从const开始向右数,只有1个*,因此const限定的是(*p)。也就是说(*p)是常量,而p是可变的。由于p是整形指针,因此const限定了(*p)也就是p指向的内容,而没有限定p本身。

 

例2. int const *p

从const开始向右数,只有1个*,因此语义与例1相同。

 

例3. int* const p

const右边没有*,因此const直接限定p,也就是指针本身。而指针指向的内容(*p)未限定。

 

例4. const int * const p

一个const限定指针本身,另一个const限定指针内容。

 

例5. const int **p

const右边为(**p),因此const限定(**p)。由于p为整数指针的指针,因此const限定有,(**p)只能为常量整数。也就是:

(*p)++合法;

p++合法;

(**p)++非法.

 

例6. int const **p

同例5.

 

例7. int * const *p

const限定的是(*p),因此:

(*p)++非法;

p++合法;

(**p)++合法

 

例8. int * const * const p

两个const分别限定了(*p)和p,因此:

(*p)++非法;

p++非法;

(**p)++合法

 

例9. const int ** const p

两个const分别限定了(**p)和p,因此:

(*p)++合法;

p++非法;

(**p)++非法

 

 

例10. const int * const * p

  两个const分别限定了(**p)和(*p),因此同例9: 

  (*p)++合法;

 

 

例11. const int * const * const p

p++非法;

(**p)++非法

 

三个const分别限定了(**p),(*p)和p,因此:

(*p)++非法;

p++非法;

(**p)++非法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值