zoukankan      html  css  js  c++  java
  • 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保存的地址。

  • 相关阅读:
    迪杰斯特拉_优先队列 模板
    POJ3268(Dijkstra_邻接矩阵)
    Uva-10815
    Uva-10474
    同余方程
    欧几里得算法与扩展欧几里得算法
    大整数型的加法
    Uva442
    《哲学起步》读后感 读书笔记
    《论大战略》读后感 读书笔记
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/3033588.html
Copyright © 2011-2022 走看看