C++之const用法总结

  • 指针与const的结合用法

指针与const的结合用法

基本概念:指针有两个值,一个是其自身的值(即所指变量的地址),一个是它所指向的值(这是理解其它用法的基础),所谓指针的指向就是指针自身的值,改变指向就是改变地址

int main()
{int a = 10, b = 20;int* p = &a;//这里没有做任何限制,两个值都可以修改*p = 100;//对p = &b;//对
}

int main()
{int a = 10, b = 20;const int* p = &a;//const在*p的左边,所以它限制的是指针p所指向的值,自身的值可以改变*p = 100;//错p = &b;//对
}

int main()
{int a = 10, b = 20;int* const p = &a;//const在p的左边,所以它限制的是p自身的值,即p的指向不可改变*p = 100;//对p = &b;//错
}

int main()
{int a = 10, b = 20;const int* const p = &a;//这里*p喝p的左侧均有const说明它的两个值都被限制了,都不可改变*p = 100;//错p = &b;//错
}


理解了上班这些,下面这个就很好理解了:

int *p1=&a;
const int *p2=&a;//p2与p3等价
int const*p3=&a;
int *const p4=&a;int *q1=&a;
const int *q2=&a;
int const *q3=&a;
int *const q4=&a;

通过上述代码判断下列代码谁对谁错:

p1=q1;
p1=q2;
p1=q3;
p1=q4

首先要知道一个重要概念:指针的能力可以收缩,但不可以扩展(扩展指的是=左边所进行的操作能否对=右边造成影响)
(1)p1和q1的权限一样,都可以对两个值进行修改 正确
(2)此时q2被限制了,p1时却没有限制,通过p1仍然可以改变p1和q1所指向的值,等价于q2被改变了,相当于q2的能力被扩展了 错误
(3)此时
q3被限制了,p1时却没有限制,通过p1仍然可以改变p1和q1所指向的值,等价于q3被改变了,相当于q3的能力被扩展了(和上述是等价的) 错误
(4)此时q4被限制了,p1没有被限制,但是,p1的改变并不会引起p4的改变,所以能力没有扩展 错误
图解:

举个栗子:咱俩去逛超市,刚开始咱们都去家福乐购物,过了一会,你想去家美佳,那么你去了家美佳,我有必要和你一起也去家美佳吗!并不需要,你去家美佳对我并没有任何影响,但是,如果咱们两个都在家福乐购物,家福乐里边的零食专柜换地方了,那么不过谁去家福乐买零食,都需要重新找地方,都收到了影响。

p2=q1;
p2=q2;
p2=q3;
p2=q4;

(1)*p2被限制了,q1没有任何限制,通过p2改变不会对q1造成影响。正确
(2)*p2被限制了,*q2也被限制了,两个权限相同,不会影响。正确
(3)*p2被限制了,*q3也被限制了,两个权限相同,不会影响。正确
(4)*p2被限制了,q4被限制了,但是p2的改变不会影响q4.正确

p3=q1;
p3=q2;
p3=q3;
p3=q4;

(1)*p3被限制了,q1没有任何限制,通过p3改变不会对q1造成影响。正确
(2)*p3被限制了,*q2也被限制了,两个权限相同,不会影响。正确
(3)*p3被限制了,*q3也被限制了,两个权限相同,不会影响。正确
(4)*p3被限制了,q4被限制了,但是p2的改变不会影响q4.正确

p4=q1;
p4=q2;
p4=q3;
p4=q4;

全部错误,因为p4是直接被const修饰的,是不可修改的,而作为左值必须是可修改的。

C++指针与const的结合用法相关推荐

  1. 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

    文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...

  2. C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08

    文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...

  3. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

  4. C/C++中const关键字的用法及其与宏常量的比较

    1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 1 const int a = 10; 2 int const b = 2 ...

  5. [转] C++中 const, volatile, mutable用法

    const.volatile.mutable的用法 const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写 ...

  6. 关于ES6中let 和 const 命令的用法以及注意事项:

    let命令: 基本用法: let定义: 用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. <script> //let代码块内部定义的变量,与var ...

  7. const和extern用法

    1.什么是const?    常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初 ...

  8. const与指针:指向const的指针与const指针的区别

    指针,可以说是C语言编程的掌上明珠,而将const应用于指针,会产生一些挺微妙的现象. 指向const的指针 第一种用法是令指针指向一个常量,称之为指向const的指针,可以防止使用该指针修改所指向对 ...

  9. C++知识点11——this指针,const成员函数,访问权限控制

    1.this指针 每个类都有this指针,this指针指向this指针指向的是类的对象本身 class A { public:A() {}~A() {}void func() {cout<< ...

最新文章

  1. 怎么判断模式窗体打开的窗体名_QtitanRibbon是什么?该怎么用?
  2. Linux内核网络数据包发送(二)——UDP协议层分析
  3. 本地maven仓库_Maven(四):仓库
  4. Delphi三层开发小技巧:TClientDataSet的Delta妙用
  5. PHP怎么检查登录和退出,如何检查用户是否以PHP登录?
  6. 安装TPCC-MySQL报错
  7. 索引-bootsrap
  8. 2015-11-16
  9. oracle label security redition,今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误...
  10. 数据结构与算法之-----栈的应用(一)
  11. 第1章 别让医生欺负你
  12. 蓝牙通信-搜索附近的蓝牙设备
  13. hive练习之join操作
  14. 让程序最小化到任务栏的时候隐藏
  15. MindFusion教程:如何构建Java Swing中的区域图
  16. 2020.8.25丨微生物基因组重测序流程梳理
  17. 企业erp系统服务器,ERP系统是什么
  18. 如何获取国际标准时间
  19. Docker下centos7镜像安装中文支持
  20. 校验MD5值是什么意思?

热门文章

  1. jieba textrank关键词提取 python_五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg,THULAC, HanLP...
  2. 小游戏策划案例精选_趣味小游戏活动方案_趣味游戏活动策划书
  3. 分页功能的实现代码 与 分页查询
  4. 计算机方面QQ群介绍
  5. Error: Your CLT does not support macOS 11.
  6. Python中Tkinter解决button的command无返回值问题
  7. react+antd修改主题色
  8. Python——文件与IO
  9. 160个CrackMe之108 mfc程序 寻找按钮事件,代码还原(上)
  10. 2021-11-26 WPF上位机 96-Modbus通信代码的封装