c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量;会占用内存空间;本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值)
1 const int abc=1;2 3 int *p=&abc;4 5 *p=3;6 7 printf("%d\n",abc); //3
1 const int* p; //p可改变,p指向的内容不可改变 2 3 int const* p; //p可变,p指向的内容不可改变 4 5 int* const p; //p不可变,p指向的内容可变 6 7 const int* const p; //p和p指向的内容都不可变 8 9 //当const出现在*左边的时候,指针指向的内容不可改变10 11 //当const出现在*右边的时候,指针本身的内容不可改变 12 13 内容不可变,不是绝对的,任然可以通过指针改变其内容 左数右指:在左边,数据内容不可变;在右边,指针内容不可变
const修饰的函数参数表示在函数体内不希望被改变;const修饰的函数返回值表示返回值不可改变,多用于返回指针的情形。
1 const int* func() 2 3 { 4 5 static int count = 0; 6 7 count++; 8 9 return &count;10 11 }12 13 int main()14 15 {16 17 int i = 0;18 19 const int* p=func();20 21 printf("%d\n",*p);22 23 return 0;24 25 }
1 const int* func() 2 3 { 4 5 static int count = 0; 6 7 count++; 8 9 return &count;10 11 }12 13 int main()14 15 {16 17 int i = 0;18 19 int* p=func(); // 会报出错20 21 printf("%d\n",*p);22 23 return 0;24 25 }
volatile:用于告诉编译器每次去内存中取变量的值,不去做优化;主要修饰可能被多个线程访问的变量;也可以修饰被未知因素被改变的变量:
编译器的优化:如果发现某个变量从未出现过在赋值左边的情况,那么这个变量就直接替换成其值,但是如果被其他因素修改,所以就会出错。1 volatile int i=0;