一般的:

const对pointer的修饰有两种:

  • const type * p/type const * p:表示指针指向的变量的值不能改变,无论指针改变为指向哪一个变量
  • type * const p:表示指针的值不能改变,不能指向其它变量

值得注意的是数组,如果一个const指针指向数组,那么这个数组都是不能通过这个指针改变的。因为无论这个指针指向哪个内存地址,它都是一个const指针,它指向的变量值都不能被改变

接下来讨论第一种类型的的一些问题。为方便,以下将称之为const指针

  • const指针将可以指向非const量,这样通过指针得到的还是const的效果
  • 用非const指针指向const变量是不可以的,有的编译器会识别为error,有的会识别为warring
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
  • 将一个const指针的值赋给一个非const指针是不可以的,将会使编译器产生一个warring或error

但是实际上编译器检查的是:

  • 是否直接通过const指针修改值
  • 是否将const指针直接赋给非const指针

如果不是通过直接赋值的方式获取到了const指针的值,并将其赋给非const指针,那么再进行变量修改将不会产生任何问题

  • 方法一:获取一个const指针存储的地址值并将其当作数值存储,比如存在一个long类型的变量中,再将这个变量通过类型转换赋值给另一个非const指针,编译器就无法识别这个过程中的危险之处。
  • 方法二:连续声明一个const变量和一个非const变量,那么可以通过一个变量推测到另一个变量的地址。此时就可以通过指向非const变量的指针指向const变量,编译器同样无法检测

多重指针:

声明为指向值不能改变的多重指针只会在改变其最终指向的值时报error,改变中间过程指向的地方不会产生error或warring

不能把一个非const类型的指针通过取地址赋值给一个比它高一重的const指针,因为这样可以通过这个非const指针改变最终指向的值,但是如果通过取const指针的中间地址并改变它为非const指针的值就不会产生error或warring

最新文章

  1. Java操作wkhtmltopdf实现Html转PDF
  2. 网页内容导出word/excel的js代码
  3. POJ2965The Pilots Brothers' refrigerator(枚举+DFS)
  4. alpha预乘
  5. It English 每日更新
  6. 17) JMS: java Message Service(Java消息服务)
  7. java调用dll文件中的类型转换
  8. 序列化对象C++对象的JSON序列化与反序列化探索
  9. EF中加载实体的方式
  10. GCC/G++ 学习笔记
  11. Shell括号之间的区别
  12. Python内置函数(63)——property
  13. webstorm2018.1 汉化
  14. Java设计模式学习记录-享元模式
  15. C# windows服务:如何获取服务程序所在的文件夹
  16. JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]
  17. js 中文长字符截短&关键字符隐藏 自定义过滤器
  18. [luogu2668] 斗地主
  19. ansible入门02
  20. android studio导入项目时一直在Grandle Build Running

热门文章

  1. WPF XAML
  2. 【学习】JMS通信模式
  3. SLAM概念学习之特征图Feature Maps
  4. 使用python进行分页操作
  5. ES6 学习3 函数
  6. UVA-11584 Partitioning by Palindromes 动态规划 回文串的最少个数
  7. sort排序到底怎么排序
  8. 洛谷——P1428 小鱼比可爱
  9. 从头认识java-17.2 线程中断(interrupt)
  10. vim 常用变量