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类型的指针,禁止编译器优化指针本身地址,但是可以优化指针指向的变量

以上,如有错漏,还请指出~

上一篇:集成StyleCop到Jenkins CI


下一篇:window.onscroll页面滚动条滚动事件