读书有感2--数据类型之const和volatile

来源:互联网 发布:unity3d象棋源码 编辑:程序博客网 时间:2024/05/16 14:08

一 const和volatile分析
1.1 const
const用来表示数值或者数组等参数具有“只读”属性,代表不可被更改,否则会照成不可想象的后果。但是如何改变const定义的变量值呢,用指针。程序员使用了const,具有哪些优点呢:
1)声明一个参数为常量是为了告诉用户这个参数的应用目的,会留下较少的垃圾让别人清理。
2)通过给优化器一些附加的信息,使用const关键字能产生更加紧凑的代码。
3)合理使用const可使编译器自然地保护那些不希望被改变的参数,防止代码被无意修改。
下面对于用const定义过的变量的一些解释:
1)const int p和int const p; // p是一个常整型数
2)const int *p; //p可变,p指向的内容不可变,p是一个指向常整型数的指针
3)int const* p; //p可变,p指向的内容不可变,
4)int* const p; //p不可变,p指向的内容可变,p是一个指向整型数的长指针
5)const int* const p: // p和p指向的内容都不可变,p是一个指向常整型数的常指针
例如1:

#include<stdio.h>int main(){    const int a = 1;    printf("%d\n",a);    a = 3;    printf("%d\n",a);    return 0;}
这段代码运行会有错,原因就在于程序想改变只读类型的变量。
#include<stdio.h>int main(){    const int a = 1;    int *p = (int *)&a;    printf("%d\n",a);    *p = 3;    printf("%d\n",a);    return 0;}
这个程序运行就可以,用指针的方式改变只读变量的值。

1.2 volatile
一个定义为volatile的变量是说明这个变量可能会被意想不到的改变,这样编译器就不会去假设这个值,优化器必须每次都到内存中取读取这个值,而不是到寄存器备份里去寻找。
1)可理解为“编译器警告指示字”。
2)用于告诉编译器必须每次都去内存中取变量值,而不是使用保存在寄存器里的备份。
3)主要修饰可能被多个线程访问的变量。
4)可以修饰可能被未知因数更改的变量。
经常被用于三个地方:
1)并行设备的硬件寄存器,如状态寄存器。
2)一个中断服务子程序中会访问到的非自动变量。
3)多线程应用中被几个任务共享的变量。
问1:一个参数即可是const也可以是volatile吗?
答:可以。例如只读的状态寄存器,它是volatile因为它可能会被意想不到的改变,它是const是因为程序不应该试图去修改它。
问2:一个指针可以是volatile吗?
答:可以。例如当一个中断服务子程序修改一个指向buffer的指针时。`

1 0