您的位置:首页 > 其它

专题一关键字的剖析----5.const,volatile分析

2017-06-12 19:30 190 查看
const

在C语言中Const修饰的变量是只读的,不能作为左值被修改,但是它不是真的常量,还是占据内存空间,其本质还是变量(通过指针还是可以修改)。

const int cc=1;
int* p=(int*)&cc;

printf(“%d\n”,cc);
*p=3;
printf(“%d\n”,cc);
剖析:

在编译原理的符号表中为:cc  int  1

当cc作为左值时:编译器报错

当cc作为右值时:int cb=cc;(直接访问)编译器直接从符号表中取值替换;

int* p=(int*)&cc;

(取地址)直接从内存找到cc现在的值(立即刷新内存)然后再替换。

 

const修饰数组时表示数组是只读的,const修饰的数组空间是不可改变的(但是通过指针还是可以改变,但是某些编译器中程序会直接死掉)。

const int A[5]={1,2,3,4,5};
int* p=(int*)A;
int i=0;

for(i=0;i<5;I++)
{
p[i]=0;      //opps!
}


Const修饰指针时,阅读技巧:左数右指

const int* p(int const* p);

int* const p;   

const int* const p;

Const在*号左边:指针指向的数据为常量,不可改变

Const在*号右边:指针本身为常量,不可更改指向。

 

Const修饰函数参数:表示在函数体中不能改变参数的值

Const修饰函数的返回值:表示返回值不可改变;多用于返回指针的时候,进行类型检查。

Volatile

Volatile用于要求编译器每次必须去内存中取变量的值(防止过度或者说不合适的优化)(多线程,中断等)。

主要用在被多个线程访问的变量,或者可能被未知因素更改的变量。

int obj=10;
int a=0;
int b=0;
a=obj;
sleep(1000);
b=obj;//编译器优化:编译器发现obj从来没有被修改,聪明地直接将obj替换为10,不再从内存中取值;对于多线程,中断,等待响应等情况出现问题。

思考:

const和volatile是否可以同时修饰一个变量?那const volatile int i=0:这个变量具有什么特性?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: