如何理解const char*, char const*, char*const等

const限定一个对象为只读属性。 

1.实际上只分const在*左,还是const在*右

        const在*左,则p可变,*p反之;const在*右,则p是const,*p反之

       详细的说:const修饰时即可放在被修饰对象前也可放在被修饰对象后。所以关键看哪个对象离const近。 const char *p 明显可以看出const离char 近,故修饰的是char 所以定义的是一个指向const char 的指针。 通过上面的分析可知,const char *p 跟char const *p 是同样的意思。 const (char *) p 与 (char *) const p 是同样的意思,const修饰指针。 const char* const p 与 char const* const p 是同样的意思。

或者

2.第一步将变量类型关键字去掉,第二步再看const修饰的变量类型.

  很明显,对于 const char c , char const c, 两者去掉类型关键字后变成 const c, 因此两者等价,变量c 是const 类型的.

  对于 const char* p , char const* p ,两者去掉类型关键字后变成 const *p,两者也等价;(*p) 是const 类型的, 而p是非const 的。其中 p 是 char* 类型的变量,非const, (*p) 是字符串内容,const.

  由上分析,很显然对于char* const p, 去掉类型关键字后变成 * const p, 因此p是const,而(*p)是非const的.

3.例子

一级指针: 

(1)const char p  限定变量p为只读。这样如p=2这样的赋值操作就是错误的。 

(2)const char *p  p为一个指向char类型的指针,const只限定p指向的对象为只读。这样,p=&a或  p++等操作都是合法的,但如*p=4这样的操作就错了,因为企图改写这个已经被限定为只读属性的对象。

(3)char *const p  限定此指针为只读,这样p=&a或  p++等操作都是不合法的。而*p=3这样的操作合法,因为并没有限定其最终对象为只读。 

(4)const char *const p  两者皆限定为只读,不能改写。

(5)const (char *) p       pconst,*p可变

(6)(char*) const p;       pconst,*p可变 

二级指针: 

(1)const char **p  p为一个指向指针的指针,const限定其最终对象为只读,显然这最终对象也是为char类型的变量。故像**p=3这样的赋值是错误的,而像*p=? p++这样的操作合法。 

(2)const char * const *p 限定最终对象和 p指向的指针为只读。这样 *p=?的操作也是错的。 

(3)const char * const * const p 全部限定为只读,都不可以改写。

4.首先, const char c 和 char const c 是等价的.但是推荐使用 char const c.

      const 修饰的是变量c(前者只不过将const 修师符提到了最前面), 变量c 是char 类型的

      而推荐使用char const c是因为    const 放在前面  的这种定义在处理typedef类型变量,很有可能存在问题.

       如:typedef char* CHARS;

       这个时候

        const CHARS x; <--  const char* x

       CHARS const x; <--  char* const x

      两者是不等价的. 而显然程序员希望得到的结果是 char* const x. 所以为了保持代码风格的一致性, 定义任何类型的const变量,都使用TYPE const x.具体原因,参见博客https://blog.csdn.net/ztz0223/article/details/4769443
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值