《c专家编程》笔记--深入理解const char*p,char const*p,char *const p

const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 

事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 
把一个声明从右向左读。 

char * const cp; ( * 读成 pointer to ) 
cp is a const pointer to char 

const char * p; 
p is a pointer to const char; 

char const * p; 
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。  
C++标准规定,const关键字放在类型或变量名之前等价的。


关于char **p 、const char **p的类型相容性问题

    1。问题

        char *p1;const *p2=p1;//合法

        char **p1;const  char**p2=p1;//不合法,会有警告warning: initialization from incompatible pointer type

        char **p1;char const**p2=p1;//不合法,会有警告warning: initialization from incompatible pointer type

        char**p1;char*const*p2=p1;//合法

    2。判断规则

        明确const修饰的对象!对于指针p1,和p2,若要使得p2=p1成立,则可读做 

             “p1是指向X类型的指 针,p2是指向“带有const限定”的X类型的指针 “。

        char *p1;const char *p2=p1;//合法:p1是指向(char)类型的指针,p2是指向“带有const限定"的(char)类型的指针。

        char **p1;const  char**p2=p1;//不合法:p1是指向(char*)类型的指针,p2是指向 ((const char)*)类型的指针。

        char **p1;char const**p2=p1;//不合法;与上等价。

        char**p1;char*const*p2=p1;//合法:  p1是指向(char *)类型的指针,p2是指向“带有const限定"的(char*)类型的指针。


最后上一个例子:

#include <stdio.h>

int main(void){

        int v1 = 1;
        int v2 = 2;

        int const *a = &v1;
        *a = 2;

        int *const b = &v2;
        b = &v1;

        char**p1;
        char*const*p2=p1;
        *p2 = &v1;

        return 0;
}
编译时出现如下错误:
const.c: In function 'main':
const.c:9: error: assignment of read-only location '*a'
const.c:12: error: assignment of read-only variable 'b'
const.c:16: error: assignment of read-only location '*p2'


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值