现在的位置: 首页 > 综合 > 正文

关于 const char* p , char const* p 以及 char * const p

2013年10月11日 ⁄ 综合 ⁄ 共 878字 ⁄ 字号 评论关闭

1.

首先, const char c 和 char const c 是等价的.

const 修饰的是变量c(前者只不过将const 修师符提到了最前面), 变量c 是char 类型的. 

 

2.

再来看const修饰指针的情况.

const char* p : 因为const 修饰符在 * 号前面,因此const 修饰的是 (*p),因此p指向的字符串是const的.

char const* p : 等价于const char* p, 因为const 修饰符在 * 号前面,因此const 修饰的是 (*p),因此p指向的字符串是const的.

char* const p: const修饰的是变量p,而变量p是 char* 类型的,所以这个char* 变量本省是const,它的值初始化后就不能变了.

 

3.

判别const 类型的方法是,第一步将变量类型关键字去掉,第二步再看const修饰的变量类型.

因此,很明显,对于 const char c , char const c, 两者去掉类型关键字后变成 const c, 因此两者等价,变量c 是const 类型的.

对于 const char* p , char const* p ,两者去掉类型关键字后变成 const *p,两者也等价,(*p) 是const 类型的, 而p是非const 的. p 和 (*p) 是什么呢? p 是 char* 类型的变量,非const, (*p) 是字符串内容,const.

由上分析,很显然对于char* const p, 去掉类型关键字后变成 * const p, 因此p是const,而(*p)是非const的.

 

 

4.

虽然 const char c, char const c 存在等价关系.

但是推荐使用 char const x,.这是const 放在前面的这种定义在处理typedef类型变量,很有可能存在问题.

typedef char* CHARS;

这个时候

const CHARS x; <--  const char* x

CHARS const x; <--  char* const x

两者是不等价的. 而显然程序员希望得到的结果是 char* const x.

所以为了保持代码风格的一致性, 定义任何类型的const变量,都使用TYPE const x.

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.