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

来源:互联网 发布:csgo弹道优化参数 编辑:程序博客网 时间:2024/05/29 14:30

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:这个变量具有什么特性?