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