c语言关键字 const
const可用来修饰变量,函数参数,函数返回值;
我见const最多的地方是函数参数列表里,比如
int printf(const char *fmt, ...);
const关键字的最大用处就是告诉代码阅读者,即我把这个变量看成常数并且保证在程序中不会对它进行修改,编译器对const修饰的变量进行检查
(检查包括类型及读写检查,这是它跟宏定义常量的一个区别;它跟宏定义的另一个区别就是它是变量,变量就需要占用数据存储空间,宏定义常量在预处理时进行了替换,那么它变成一个数值存储在代码里)
但是编译器只对const直接修饰的变量进行检查,这就是说,如果我对const变量进行了间接修改(使用指针),编译器是不知道的;那么对const进行间接修改的问题只能在运行时才能显现出来。
既然编译器检查const修饰的变量本身的访问,那么
void fun(){
const int i=1;
const int *p;
int * const q;
i=2; /*编译报错*/
p=(int*)malloc(sizeof(int)*10); /*ok*/
p[1]=1; /*编译报错*/
q=p; /*编译报错*/
}
如果对const修饰的变量进行间接修改,编译不会报错,在运行时就会根据不同情况出现不同结果,考察下面的代码:
const int i=1;
const int j;
void fun(){
const int k=1;
static const t=1;
static const m;
const int *q=(int*)malloc(sizeof(int)*10);
}
对上面i,j,k,t,m分别进行间接修改,使用
int *p=(int *)&x; /*x为i,j,k,t,m*/
*p=2;
对数组q的修改,使用
int *p=q;
p[1]=1;
对i,t的修改会导致“段错误”,即程序试图修改只读段(代码段.text)的内容而出错;
而对j,k,m及数组q的修改则不会出错,因为这些数据所在的段是可写的: j,m在.bss段;k在栈内;数组q的内容在堆中。
把const int *p指针赋给int *q指针需要强制类型转换,要不然会有warning;反过来则不需要
合理的使用const关键字可以使编译器保护那些不希望被改变的参数,防止其被无意间修改,减少bug。
阅读(888) | 评论(0) | 转发(0) |