C语言难点专题——const

晨曦之光 发布于 2012/03/09 12:11
阅读 72
收藏 0

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* pC = "abcd"; pc[1] = 'w'; //这里运行会直接报错, 原因是, 在定义pC指针时, 我们丢掉了修饰符号, 造成了一个莫大的隐含错误, 正确的定义应该是: 
const char* pC = "abcd";//这样可以将错误在编译的时刻给我们提示。
与此相对的另外一个定义
char a[] = "abcd";
//这里不是指针, 而是数组, 可以视为编译器允许的一个特殊语法.
其实质的含义是, 将abcd放入到数组的存储区间中
//如果换种做法,不被允许
const char* p = "abcd";
char a[] = p;
//因为指针和数组是两个类型, 同事也说明char a[] = "abcd";是一个非常特殊的语法, 需要我们记住。

 

       扩展一下,下面有错吗?

       char* const pChar = "agc";

       char* pp = pChar;

 

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

 

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

 


原文链接:http://blog.csdn.net/ostrichmyself/article/details/4952629
加载中
返回顶部
顶部