const用法之修饰指向常量的指针

  在XP平台使用VC++6.0编译运行如下代码:

1     char *s="AAA";
2     printf("%s\n",s);

编译运行一切正常,但如果在加入一些代码,例如:

1     char *s="AAA";
2     printf("%s\n",s);
3     s[0]='B';
4     printf("%s\n",s);

编译通过,但运行过程中输出“AAA”之后,系统弹出“带调试的发送错误报告”对话框,问题表现出来啦。

  这其实是一个概念性的问题,AAA是字符串常量,为了对它进行操作,定义了一个指针char *s,但是,s是一个普通的指向char型“变量”的指针,用一个指向变量的指针指向常量,自然会留下隐患。例如像代码中那样对s[0]进行赋值,编译器不会发现这个错误,但是,只有变量的值才是可以修改的(常量无法被赋值,也无法被修改),这个动作的意图是通过指针s来修改一个常量的值,于是,运行的时候错误发生了。

  解决这个问题的办法就是从“AAA”最本质的归属出发,需明确告诉编译器,指针指向的类型是常量,不可修改,于是:

1     const char *s="AAA";
2     printf("%s\n",s);

这样,如果再有对“AAA”有写的动作,编译器就会提示错误,减少后期bug的出现,这也是const的一个重要用法。

  这是一个入门的问题,也是一个隐蔽性很高的问题,在此列出,以示警醒。

 2013-05-01

其它延伸:

const指针的性质:假设有

int *p const = &a;

那么,可以改变p所指向的值,但不能改变p保存的地址。

 

 

 

 

posted on 2013-04-21 10:41  毋忆典藏  阅读(300)  评论(0编辑  收藏  举报