1、const修饰的变量
const修饰的变量是不能通过变量再次赋值而改变。
1 int main{ 2 char buf[4]; 3 const int a = 0; //a不可改变 4 a = 10; //error 5 }
这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。
int main{ char buf[4] = {0}; const int a = 0; buf[4] = 97; //越界操作 printf(“the a is %d\n”,a); }
如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。
第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是无能为力的,也说明const修饰的变量仍然是具备变量属性的。
综上说明,const修饰变量没有改变变量代表的存储区本身的属性,只是从编译器层面进行了优化,被const修饰的变量不是常量。
另外const也不会修改变量的生命周期和作用于。
2、const修饰的几种形式
const int a = 5; <==> int const a = 5; const int *p = &i; //const修饰的对象为*p,即变量i不可变,p可变 const (int*) p = &i; //const修饰的对象为p,p只能指向变量i的存储区,i可变 int * const p = &i; //同上 ------------------------------------------------------------------ typedef int * p_int; const p_int p = &i; //此时const修饰的是p,p不可变,i可变
3、修改const修饰的变量的值
1)修改只读常量 #include <stdio.h> int main(void){ const i = 5; int *p = (int *)&i; *p = 6; printf("%d\n", i); return 0; } 2)修改指针常量 #include <stdio.h> int main(void){ i = 5; const int *p = &i; int *q = p; *q = 6; printf("%d\n", *p); return 0; } 3)修改常量指针 #include <stdio.h> int main(void){ int i = 5; int j = 6; const int *p = &i; printf("%p\n", p); int **q = (int **)&p; *q = &j; printf("%p\n", p); return 0; }
时间: 2024-10-12 01:38:18