const int * , int const *, int * const,顶层const和底层const

区分const int * , int const *, int * const

  1. const int * p = 1 表示变量p所指的对象是不变的,p是可以改变的,即*p = 1不可以改变,但p的地址可以改变;
  2. int const * p = 1同上;
  3. int * const p = 1表示变量p不可以改变,即地址不变,但所指的对象可以改变。

底层和顶层const概念区分

顶层const :指const所修饰的变量本身是一个常量,自身无法更改;例如上述int * const p = 1,其中p的值无法更改,所以是一个顶层const

底层const :指const所修饰的变量所指的对象是一个常量,变量自身可以改变;例如上述const int * p = 1或者int const * p = 1,p的值是可以改变的,但是*p不可以改变。

作用区分

按照常识,一个非常量可以赋值给另一个非常量和一个常量;但是一个常量只能赋值给另一个常量,因此在此处也是如此。

当执行拷贝操作时,顶层const不受影响,但是底层const的只能拷贝到底层const

在下方我们会看到一个矛盾却又不矛盾的例外

		 `const int j = 2` 或者是`int const j = 2` 

在《C++ Primer》 第五版中,他告诉我们这是一个顶层const,似乎不难理解,毕竟j的本身是一个常量。但是当我使用下面语句赋值时,

					`int* const p2 = &j`

编译器报错了,他告诉我"const int *" 类型的值不能用于初始化 "int *const" 类型的实体

不过虽然违背了我们之前所讨论的,但是如果单单将const int j = 2 看做一个常量,似乎又不难理解了,毕竟,常量无法初始化一个非常量。

上述是我的粗浅理解,如果各位大佬有不同的理解,请告诉我,感谢!

void test()
{
    int i = 1;
    int const j = 2;    //j 的值不可以更改,这是一个顶层const
    int* const p1 = &i;  //const修饰的是p本身,不能改变p1的值,其是一个顶层const
    int const * p3 = &j;    //const 修饰的是p3所指的对象  
    p3 = &i;    //p3的值可以改变
    int * const p4 = p1;    //顶层const 赋值给 顶层const
    int const * p5 = p1;    //顶层const 赋值给 底层const
    int const * p6 = p3;    //底层const 赋值给 底层const
    //int * const p7 = p3;  //不能将一个底层const 赋值给 顶层const

    //例外在于 j = 2 
    //int* const p2 = &j;   //此处会报错
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值