C语言难点专题——const

来源:互联网 发布:阿里云logo含义 编辑:程序博客网 时间:2024/04/27 22:56

1. const对值类型的数据修饰: 如基本类型(int, double, char), struct, array

 

  •  值类型的数据,const放置在前面和后面都一样。
  •  对于struct和 Array类型的数据, 跟java的类对象不同,由于java都是对象的引用,所以只要求引用不乱指就行, 而c中,直接要求这个对象的内部成员都不可改变,即struct的任何成员,不可改变,array的任意一项不可改变。这就意味着:

         const struct abc  a;
         a.score = 10;     //不容许再次赋值

 

2. const对地址类型数据的限制, char*, char**等

  • const和  * 的相对位置,决定了const 到底是修饰指针不可变还是内容不可变
  • const放在* 之后,表示指针不可变, const 放在* 之前,表示内容不可变。 我们可以这样理解,*P表示内容, 所以前面如果加const,当然是指内容不可变。 而仅仅一个P表示的是指针,前面如果用const修饰,当然实说,这个指针不变了。
  • 当指针类型的数据相互复制的时候,即右边的参数,交给左边的参数掌控。因此,左边的参数不能越权。

       const char* pChar = "agc";

       char* pp = pChar;         //这里权限信息丢失了,导致pp可以任意操作,有些编译器直接报错,有些要到运行才抛出异常

       经常让人迷惑的一个问题:

     

 

       扩展一下,下面有错吗?

       char* const pChar = "agc";

       char* pp = pChar;

 

        答案是无错。 提示: pChar不能乱指,当赋值后,放置同一个东西, pChar是否为const,并没有因此改变。

 

  • 左边的指针,可以在右边的基础上添加新的修饰,比如原来指针const,新指针可以是const的指针和const的内容。