• 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保存的地址。

  • 相关阅读:
    MongoDB学习:(一)MongoDB安装
    事件轮询 Event Loop
    常见的HTML5语义化标签
    前端动画性能优化方案
    前端动画的实现
    《SVN的操作流程及规范》
    css、js文件后的后缀作用是什么?
    实现单行文字溢出显示...,以及多行文字溢出显示...
    从输入URL到页面返回的过程详解
    jQuery实现点击复制效果
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/3033588.html
Copyright © 2020-2023  润新知