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 ...
随机推荐
- 在table中tr的display:block在firefox下显示布局错乱问题
[转自:] http://blog.csdn.net/sd2131512/article/details/4720345 按照常理,对于某一单元行需要显示时,使用:display:block属性,不需 ...
- 1-10假期训练(hdu-2059 简单dp)
题目一:传送门 思路:水题,模拟即可 题目二:传送门 思路:dp,决策每个充电站是否要充电.(决策只有搜索,DP两种解决方法) (1)考虑状态的个数,n+2个,因为除了n个还有位置0,终点len两种状 ...
- .NET性能优化(文摘)
第1章 性能指标 1.1 性能目标 1.2 性能指标 第2章 性能度量 2.1 性能度量方式 白盒测试-小程序 黑盒测试-大型程序 2.2 Windows内置工具 2.2.1 性能计数器 2.2.2 ...
- latex字体颜色
具体的如下:\usepackage{color} 1. {\color{red} 文本} 2. \textcolor[rgb]{1,0,0}{文本} 颜色参数范围为[0,1]
- 最全js表单验证
/***************************************************************** 表单校验工具类 (linjq) ***************** ...
- jq页面加载分割截图
<script> $(document).ready(function() { if (!Array.prototype.forEach) { Array.prototype.forEac ...
- es6函数的新语法
函数的默认值 function(x,y=10){ //赋予了y就有了默认值为10,如果y赋值了,就回被覆盖,否则就是默认值10 变量已经有默认值了,所以不用再次用let或者const声明啦 }
- SpringBoot中用Fastjson替换默认的Jackson
一:前言 经过测试,Jackson有很多不合人意的地方,因此建议用Fastjson来替换: 二:Jackson的坑 先定义实体类: @Data @AllArgsConstructor @NoArgsC ...
- 在eclipse上搭建Roku开发环境
环境:Oracle VM virtualBox+Ubuntu server 12.0.4.2 LTS+xfce+ Eclipse IDE for C/C++ Developers 4.3.2 参考:h ...
- 通过request获取网页资讯 通过BeautifulSoup剖析网页元素
import requests newsUrl ='http://news.sina.com.cn/china/' res = requests.get(newsUrl) res.encoding ...