例子1:
char ch = 'a';
const char * pchar = &ch; // 修改pchar合法,修改*pchar不合法
char const * pchar = &ch; // 修改pchar合法,修改*pchar不合法
char * const pchar = &ch; // 修改pchar不合法,修改*pchar合法
然后例子2:
const char ch = 'a';
char const ch = 'a';
这两句话的作用是相同的,定义了一个不可修改的字符变量ch,可见const写在typename前面或者写在typename后面的作用是一样的。
再来例子3:
typedef char * PCHAR;
const PCHAR pchar = &ch;
PCHAR const pchar = &ch;
同样,上面两句话的作用也是相同的,定义了一个字符指针pchar,且修改pchar是非法的,但是*pchar是可修改的。所以const PCHAR pchar也就相当于const ( char * ) pchar,只是C++并不支持后者的写法。基于例子2和例子3,我们再分析一下例子1:
char ch = 'a';
const char * pchar = &ch; // const修饰的是char,所以修改*pchar不合法
char const * pchar = &ch; // const修饰的是char,所以修改*pchar不合法
char * const pchar = &ch; // const修饰的是char *,所以修改pchar不合法,这句话和例子3的第二句是一样的