const 那点事儿

修饰变量时 const char 与 char const 是等价的,例如
  1. const char a = 'a';
  2. char const a = 'a';
表示变量a不能再被赋予其他值.

到指针时情况有点复杂,有 const 限定指针本身和限定指针指向的内容的区别,同样首先要说明的是
  1. const char *p = "ABC";
  2. char const *p = "ABC";
这两种写法完全一样,都表示指针 p 指向的内容不能通过指针 p 修改,指针本身是可以指向其他内存地址的,这样说不是很明白,因为"ABC"本身就是常量,不能被修改,还是代码解释吧
  1. char buf1[] = "ABC";
  2. char buf2[] = "DEF";
  3. const char *p = buf1;
  4. *p = 'B'; // 错误,在p看来,buf1的内容是不可改变的,想通过p来修改buf1的内容编译器将报错,事实上buf1的内容是否可变由buf1本身属性决定
  5. p = buf2; // 没问题,指针p本身并不是const
与此对应还有另一种情况 
  1. char buf1[] = "ABC";
  2. char buf2[] = "DEF";
  3. char * const p = buf1;
  4. *p = 'D'; // 没问题, const 修饰 p 本身,表示p指向的内存地址不能改变,但是内存地址上的内容并没有被限定为const,内容是可以通过p改变的
  5. p = buf2; // 错误,p为常量,初始化后不能被赋予其他值
一种比较变态的写法
  1. char buf[] = "ABC";
  2. const char * const p = buf; // 这么做以后既不能将p指向其他内存地址,也不能通过p修改buf的内容
总结来就是 :
const 在 * 左边时表示指针指向的内容不能通过指针修改,但是指针本身是可变的,它可以指向其他的内存地址(const 限定指向的内容);
const 在 * 右边时表示指针本身是不可变的,它不能再指向其他的内存地址,但是可以通过指针修改它指向的内容(const 限定指针本身).




posted @ 2016-08-17 17:38  琼'  阅读(146)  评论(0编辑  收藏  举报