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的内容。