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