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