一、const和volatile分析
1、const修饰变量
# 在c语言中const修饰的变量时只读的,其本质还是变量
# const修饰的变量会在内存占用空间
# 本质上const只对编译器有用,在运行时无用
原来const不是真的常量
2、const修饰数组
# 在C语言中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] = 5-i;//报错
}
3、const修饰指针
# const int *p; //p可变,p指向的内容不可变
# int const *p; //p可变,p指向的内容不可变
# int *const p; //p不可变,p指向的内容可变
# const int *const p; //p不可变, p指向的内容不可变
口诀:左数右指
当const出现在*号左边时指针指向的数据为常量,当const出现在*后右边时指针本身为常量
const修饰函数参数和返回值
# const修饰函数参数表示在函数体内不希望改变参数的值
# const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
const int * func()
{
static int count = 0;
count++
return &count;
}
深藏不漏的volatile
1、volatile可理解为“编译器警告指示字”
2、volatile用于告诉编译器必须每次去内存中去取变量值
3、volatile主要修饰可能被多个线程访问的变量
4、volatile也可以修饰可能被未知因数改变的变量
int obj = 10;
int a = 0;
int b = 0;
a = obj;
sleep(100);
b = obj;
以上代码,编译器在编译的时候发现obj没有被当成左值使用,因此会“聪明”的直接将obj替换成10,而把a和b都赋值为10.
课后思考
# const和volatile是否可以同时修饰一个变量?
# const volatile int i = 0; 这个时候i具有什么属性?编译器如果处理这个变量?
答:可以。这个时候i具有const和volatile的双重属性。i变量不可以在编译过程中被程序代码修改,同时编译器不得对i进行优化编译。