Home > programming > const char* p , char const* p 以及 char * const p

const char* p , char const* p 以及 char * const p


口诀:
const 和 char 只要是紧挨着, e.g const char *p , and char const *p, the “char” value is const, but the pointer can be modified.
const 和 char 如果被*隔开了,那么pointer cannot be modified, but the “char” value can be modified!
victor’s code:

25 // difference among: const char *p, char const *p, and char * const p
26
27 char val = 'a';
28 char another = 'e';
29
30
31 const char *p = &val;
32
33 char const *q = &val;
34
35 //*q='b'; // cant compile, coz cannot change p pointed value;
36
37 cout<<"*p="<<*p<<endl;
38
39
40 cout<<"p was ="<<&p<<endl;
41
42 p = &another;
43 cout<<"p is now ="<<&p<<endl;
44
45
46 char * const r = &val;
47
48 *r = 'c'; // can modify the value, but not pointer addr
49 cout<<"*r="<<*r<<endl;
50
51 //r = &another;
52 cout<<"*r="<<*r<<endl;

原贴来源:
1,
const char* p , char const* p 以及 char * const p
首先, 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.

转载于:http://hi.baidu.com/skyland_lee/blog/item/4f516738800e7acbd5622583.html

Advertisements
Categories: programming
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: