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

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

  • 相关阅读:
    buuctf-web [强网杯 2019]随便注 1
    buuctf-crypto 引用可打印
    buuctf-crypto 变异凯撒
    buuctf-misc 文件中的秘密
    buuctf-misc LSB
    nginx 模块配置
    cloudflare CDN下nginx获取用户真实IP地址
    使用nginx后如何在web应用中获取用户ip及原理解释
    获取用户真实 ip 地址的 nginx 相关配置
    解决nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
  • 原文地址:https://www.cnblogs.com/chenjx85/p/10747802.html
Copyright © 2020-2023  润新知