Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520458
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2007-10-24 15:33:47

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。
阅读(858) | 评论(0) | 转发(0) |
0

上一篇:数组初始化

下一篇:C变量存储空间

给主人留下些什么吧!~~