c++中的const和volatile知识自我总结
学习了下c++中的const关键字,总结如下。
1、const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”。
int main()
{
const int a = 6;
cout << a << endl;
a = 10;
cout << a << endl;
return 0;
}
2、如果通过指针强行修改呢,如下面代码这样子。
int main()
{
const int a = 6;
cout << a << endl; int *p = (int*)&a;
cout << p << endl;
cout << *p << endl; *p = 12;
cout << *p << endl;
cout << a << endl;
}
编译可以通过,但是输出来之后可以看到a还是6,但是*p是12。
这是怎么回事?p明明是指向变量a的一个指针,怎么会指针指向的内存空间存储的变量的值已经修改了,但是输出仍然是改变前的值?
笔者看了一些资料,【应该是】因为编译器对于const类型的变量都不会二次读取,只会在最开始的时候从内存中读取一次,之后存储在常量表中,之后需要用到就从常量表中取得。
所以即便指针指向的值已经修改过了,但是读取仍然是改变前的值。
3、常量指针和指针常量
常量指针:指向常量的指针,也就是指针指向的是一个常量,值不可以改变,但是指针本身地址可以改变,可以指向其他地址。
指针常量:指针地址是个常量,指针本身地址不能改变,但是指针指向的变量的值可以改变。
常量指针有两种写法,如下两种。
const int *p1;
int const *p2;
这两种都是说指针是个const int类型的指针,只不过const的位置比较飘忽,可以在int前面,也可以在int后面。
指针常量只有一种写法,如下。
int a=2;
int* const p3=&a;
指针常量是int类型的指针,定义的时候必须初始化地址,因为指针常量不能被修改地址。
4、volatile是一个指令关键字,也是用来修饰类型的,告诉编译器这个变量是可变,不要对其进行优化。
通常来讲,编译器会对代码进行优化,详细解释我觉得这篇博客写得很好,大家可以参考一下这一篇https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html
总的来说,volatile可以确保每次使用变量的时候,都从内存中重新读取,而不允许编译器对这个变量的读取操作进行优化。一般在多任务环境下会用到这个关键字。
volatile的指针和const一样,分两种,见以下代码。
volatile int *p1;//volatile int类型的指针,禁止编译器优化指针指向的变量,但是可以优化指针本身地址
int volatile *p2;//同上,另一种写法 int* volatile p3;//int类型的指针,禁止编译器优化指针本身地址,但是可以优化指针指向的变量
以上,如有错漏,还请指出~
c++中的const和volatile知识自我总结的更多相关文章
- C语言中关键字auto、static、register、const、volatile、extern的作用
原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.exter ...
- C++ 中 const、volatile、mutable的用法
@2019-01-14 [小记] C++中const.volatile.mutable的用法
- [转]C++中const、volatile、mutable的用法
原文:https://blog.csdn.net/imJaron/article/details/79657642 const意思是“这个函数不修改对象内部状态”. 为了保证这一点,编译器也会主动替你 ...
- c++中的 const 关键字
知识回顾:C语言中 const const 修饰的变量是 只读的,本质上还是变量:(只读变量:可以通过指针修改只读变量中的值) const 修饰的局部变量在栈上分配空间: const 修饰的全局变量在 ...
- C++中的const
一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...
- C++ const、volatile、mutable的用法 (转)
const.volatile.mutable的用法 鸣谢作者: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通 ...
- C++中的const关键字
http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
- C与C++中的const
同样,有下面一段代码: #include <iostream> using namespace std; int main() { ; int *j = (int *) &i; * ...
- const、volatile、mutable的用法
http://blog.csdn.net/wuliming_sc/article/details/3717017 const.volatile.mutable的用法 const修饰普通变量和指针 co ...
随机推荐
- 2018.10.25 uestc上天的卿学姐(计数dp)
传送门 看了DZYODZYODZYO的题解之后发现自己又sbsbsb了啊. 直接dpdpdp是O(2d)O(2^d)O(2d)更新,O(1)O(1)O(1)查询或者O(1)O(1)O(1)更新,O(2 ...
- 百度地图足迹demo(多点轨迹生成)
不要忘记引用JQuery//~~~<script src="jquery-1.7.1.min.js" type="text/javascript"> ...
- crt转cer ,6.0以上的android系统证书请求配置
1.在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句 openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der 这样你就可以得到cer ...
- excel2007VBA绘图2
'--------------------------------------------------------Module1------------------------------------ ...
- P1(2)线性回归
线性回归问题,是监督学习,输出是连续值.(批梯度下降训练参数+平方误差函数做代价函数)
- mysql学习之路_高级数据操作
关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记一之铭文升级版
第一章:课程介绍 铭文一级: VMware Fusion Mac上搭建:为了给大家演示如何使用我们的OOTB环境 Hadoop环境:虚拟机,我是远程登录 Mac 那么就不需要使用我们的OOTB环境 V ...
- 解决编译错误:cc: Internal error: Killed (program cc1)
错误现象: cc: Internal error: Killed (program cc1) ... 大体上是因为内存不足,临时使用交换分区来解决吧 sudo mkswap /swapfile sud ...
- 利用tcpcopy引流过程
tcpcopy是一个tcp流量复制工具,当前还支持udp和mysql流量的复制. 目的: 将机器10.24.110.21的5000端口流量引流到机器10.23.25.11的5000端口. 示例:将10 ...
- js基础学习笔记(一)
* 在js编写过程中,尽量保持统一使用单引号 'XXXX': * 所有变量都要声明 var,避免全局函数调用的冲突: 1.1 输出内容 docment.write(‘aileLi’); 改变某I ...