标签:第一个 注意 报错 error 不能 -- 编译 ons 比较
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;
}
标签:第一个 注意 报错 error 不能 -- 编译 ons 比较
原文地址:http://www.cnblogs.com/love-lzb/p/6850931.html