一、const
(1)const修饰变量
1)在C语言中const修饰的变量是只读的,其本质还是变量;
2)const修饰的变量会在内存占用空间;
3)本质上const只对编译器有用,在运行时无用(const不是真的常量)。
const int c = 1;//只读的变量c
int *p = (int*)&c;//取地址,改变地址值
printf("%d\n", c);
//c = 2;只能为左值
*p = 3;
printf("%d\n", *p);
(2)const修饰数组
在C语言中的const修饰的数组是只读的,空间不可被改变
const int arr[5] = {1,2,3,4,5};
int *p = (int*)arr;
int i = 0;
for(i = 0; i < 5; i++)
{
printf("%d ",arr[i]);
}
for(i = 0; i < 5; i++)
{
p[i] = 5 - i;
}
printf("\n");
for(i = 0; i < 5; i++)
{
printf("%d ", p[i]);
}
(3)const修饰指针
1)const int* p; p可变(p指向的地址值可变) p指向的内容不可变
2)int const* p; p可变(p指向的地址值可变) p指向的内容不可变
3)int* const p;p不可变 p指向的内容可变
4)const int * const p;都不可变
(4)const修饰函数参数和返回值
1)const修饰函数参数表示在函数体内不希望改变函数的参数值;
2)const修饰函数返回值表示返回值不可改变,多用于返回指针的情形;
const int* fun()
{
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
在sleep(100)期间 若有硬件中断 而在此中断中 我们想要得到的值为中断后b的值 而此时 b的值仍为10
使用volatile,编译器从内存中每次取值,不会做任何优化。