免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1197 | 回复: 0
打印 上一主题 下一主题

C语言关键字之const [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-17 18:32 |只看该作者 |倒序浏览
const关键字是嵌入式程序员必须熟悉的。因为它的使用可以增加程序的健壮性,并且使读者更好地理解程序。
它所修饰的变量被叫做“只读变量”。注意“只读变量”!=“常量”。千万不要说被const所修饰的变量就是常量!那只能说明你对const还不太理解!下面就让我们来分析一下const。
首先看以下定义:
const int a = 3;
int const a = 3;
const char b = '1';
char const b = '1';
const char s[] = "123456789";
char const s[] = "123456789";
这里const的位置对变量没有影响。有了const的修饰,以上的变量就表示只读的,如果在编译过程中想要改变以上变量的内容,那么编译器就会报错。知道了这点,我希望以后大家在写程序时在能加const的地方都加上,这样你的程序会更加完美的!
在我的经验里,经常在函数的参数里加const,就是说明这个参数是只读的。例如我定义以下函数(功能是求字符串长度):
int Strlen(const char *s);
显然传入的参数s的内容是不能被改变的,因为一旦被改变,长度就可能返回一个错误值。加上const就非常有效地避免了这一点!
这里还有一个问题,如果我把以上函数这样定义对不对呢:
int Strlen(char* const s);
答案是:不对!!!可能有人就要问为什么不对啊?const的位置对变量没有影响啊!我要说的是const的位置对普通变量是没有影响,但是对指针变量有着严重的影响!!下面让我们来分析一下这种影响:
const char *s1 = "11111";     (1)
char const *s2 = "22222";     (2)
char* const s3 = "33333";     (3)
分析指针变量时,我们关键要看const后面的内容。
(1)式const后面是*s1,即它修饰了*s1的内容,也就是说s1指针所指的内容是不可以被改变的!!但是s1本身可以被改变。举个例子大家就清楚了:
const char *s1 = "11111";
char *p = "aaaaa";
s1[1] = '2';(这里会编译错误)
s1 = p;(这里编译正确)
s1[1] = '3';(这里也编译错误)
即s1所存的地址是可以改变的,但是该地址指向的内容是不能改变的!
(2)式和(1)式是一样用法的。因为const后面都是*s2,*s1.
但是(3)式就不一样了,因为const后面是s3, s3也是一个指针,但是const修饰的是s3,不是*s3,所以它是内容可以变,但是s3本身不能变!即s3指向的地址不可以被改变,但是内容可以变。这正好与上面的两个式子意义相反。
ok,到这里const大家应该就会用了吧?记住,const修饰指针时一定要注意const修饰的是什么!

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94212/showart_2072582.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP