首页 > 代码库 > C语言中const关键相关问题
C语言中const关键相关问题
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;
}
C语言中const关键相关问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。