const限定一个对象为只读属性。
1.实际上只分const在*左,还是const在*右
const在*左,则p可变,*p反之;const在*右,则p是const,*p反之
详细的说:const修饰时即可放在被修饰对象前也可放在被修饰对象后。所以关键看哪个对象离const近。 const char *p 明显可以看出const离char 近,故修饰的是char 所以定义的是一个指向const char 的指针。 通过上面的分析可知,const char *p 跟char const *p 是同样的意思。 const (char *) p 与 (char *) const p 是同样的意思,const修饰指针。 const char* const p 与 char const* const p 是同样的意思。
或者
2.第一步将变量类型关键字去掉,第二步再看const修饰的变量类型.
很明显,对于 const char c , char const c, 两者去掉类型关键字后变成 const c, 因此两者等价,变量c 是const 类型的.
对于 const char* p , char const* p ,两者去掉类型关键字后变成 const *p,两者也等价;(*p) 是const 类型的, 而p是非const 的。其中 p 是 char* 类型的变量,非const, (*p) 是字符串内容,const.
由上分析,很显然对于char* const p, 去掉类型关键字后变成 * const p, 因此p是const,而(*p)是非const的.
3.例子
一级指针:
(1)const char p 限定变量p为只读。这样如p=2这样的赋值操作就是错误的。
(2)const char *p p为一个指向char类型的指针,const只限定p指向的对象为只读。这样,p=&a或 p++等操作都是合法的,但如*p=4这样的操作就错了,因为企图改写这个已经被限定为只读属性的对象。
(3)char *const p 限定此指针为只读,这样p=&a或 p++等操作都是不合法的。而*p=3这样的操作合法,因为并没有限定其最终对象为只读。
(4)const char *const p 两者皆限定为只读,不能改写。
(5)const (char *) p p是const,*p可变
(6)(char*) const p; p是const,*p可变
二级指针:(1)const char **p p为一个指向指针的指针,const限定其最终对象为只读,显然这最终对象也是为char类型的变量。故像**p=3这样的赋值是错误的,而像*p=? p++这样的操作合法。
(2)const char * const *p 限定最终对象和 p指向的指针为只读。这样 *p=?的操作也是错的。
(3)const char * const * const p 全部限定为只读,都不可以改写。4.首先, const char c 和 char const c 是等价的.但是推荐使用 char const c.
const 修饰的是变量c(前者只不过将const 修师符提到了最前面), 变量c 是char 类型的
而推荐使用char const c是因为 const 放在前面 的这种定义在处理typedef类型变量,很有可能存在问题.
如:typedef char* CHARS;
这个时候
两者是不等价的. 而显然程序员希望得到的结果是 char* const x. 所以为了保持代码风格的一致性, 定义任何类型的const变量,都使用TYPE const x.具体原因,参见博客https://blog.csdn.net/ztz0223/article/details/4769443const CHARS x; <-- const char* x
CHARS const x; <-- char* const x