顶层与底层const

顶层与顶层const

  • 首先顶底层const这个概念一般来说是对指针来说的,因为对于指针变量而言,不仅有指针本身(所指变量的地址值),还有所指变量的值。而这个两个值都是可以进行限定const的。
  • 而对于一般的变量,只有一个变量的值所以最多只可以使用一个const限定。而如果用const限定这种非指针变量我们把这种const叫做顶层const。

下面有简单到复杂逐步复习关于const的一些知识

  1. 非指针变量的顶层const。
char s='A';
//const char c;
const char c=s;

对于第二行来说,如果我们直接这么写的话vs是会给我们显示错误的。如下图所示,图片告诉我们必须要对const variable "c"初始化,在初始化之后就不能再对c进行修改了。
这也是const变量与普通变量的区别,普通变量既可以只先声明再赋值,又可以直接定义。而const变量只能直接定义进行初始化。
在这里插入图片描述

  1. 放在类型说明符后的const
    嗯这个标题不是很准确,但是这确实是最直观的描述方式,下面将对于这种方式声明的const变量进行一些尝试。
    代码以及vs显示如下所示:在这里插入图片描述
    我们发现这时和1的报错完全一致,要求我们必须对指针变量pc初始化。这说明这个const也是顶层const,用来说明char类型指针pc指向的值是不能够进行修改的。
    那么为了进一步的验证所得出的结论,所以我们对pc初始化后,尝试修改指针所指向的地址(即修改指针的地址)。代码以及报错如下:在这里插入图片描述通过这个例子,很明显的说明在在类型说明符后的const限定的是指针本身。那么我们想是否可以把代码const T name改成 T const name呢?
    ——事实上这样是完全可以的,只是我们更倾向于书写第一种。但是第二种可以很好的帮助我们理解顶底层const限定的都是谁的值。

  2. 放在类型说明符前面的const

那么首先不对pc进行初始化,然后发现VS并没有对我们这样的书写方式给出错误,那么就说明我们这么做ide暂时没有检查出来错误。

在这里插入图片描述
这说明了什么呢?
①pc的值是可以修改的,否则vs会要求我们必须初始化pc。
②那么根据排除法,在类型说明符前面的const只能用来限定指针指向位置的值是一个常量了。
根据②的推理结果,那么我们尝试一下给pc赋值。代码与显示如下图:
在这里插入图片描述
首先我们使用普通的字符变量s对pc进行赋值,vs没有报错。而之后对pc解引用赋值的时候,vs给出了报错。提示为expression must be a modifiable lvalue。这即说明*pc是一个不可修改的左值。
那么通过这个例子可以看出,在类型说明符之前的const即限定指针指向的值是const类型的。

[Attention]
这里说的不能对指针指向的值进行修改,是指不能用解引用符*来修改,而不是一定不能对指向的值
比如我们可以直接对s进行修改就可以了,但如果pc执行的值是const char,那么就不能修改了。

4.前后都有的const:
好了终于到了两个const的时候了。那么根据以上的结论,两个const组合起来并没有什么比较特别的,只是把2 3 所说的const类型的性质加起来就可以了。

底层与顶层const:

  • 顶层const:放在类型说明符之后的const,用来说明自己之后的类型名所代表的变量是const的,必须在定义时初始化且不能在之后进行修改。
  • 底层const: 底层const放在类型说明符之前,用来表示指针所指向的值无法被**解引用符***直接修改。*可以认为最前面const之后的那一大堆是一个整体,而这一个整体的指针变量解引用的值是一个常量)。

关于顶底层const的类型转换。

  1. const T传递给T
    这个是被允许的,在传递过程中顶层const被丢弃,接受传递值的T可以被修改。

  2. T 传递给 const T
    这是不被允许的,const T类型被初始化之后就不允许被修改了。

  3. const T* 传递给const T* const
    可以传递,不会报错

  4. const T* const 传递给T* const
    这个操作时是不被允许的,因报错如下图所示:
    报错时候说const char* 不能初始化char* const类型。即底层const不能赋值给非底层const修饰的变量,而顶层const赋值给没有顶层const的变量时const可以被忽略在这里插入图片描述

  5. 引用类型的const限定。
    同样遵循以上的规律,在这里不在写了如果有需要会再添加一篇文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值