标签:这一 turn 地址 arc 表达 行修改 编译器 指针常量 知识
学习了下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类型的指针,禁止编译器优化指针本身地址,但是可以优化指针指向的变量
以上,如有错漏,还请指出~
标签:这一 turn 地址 arc 表达 行修改 编译器 指针常量 知识
原文地址:https://www.cnblogs.com/chenjx85/p/10747802.html