int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]
typedef char * Pchar; // pointer to char
typedef const Pchar CPchar; // const pointer to char
typedef const char * PCchar; // pointer to const char
typedef Pchar * PPchar; // pointer to pointer to char
typedef const char * const CPCchar; // const pointer to const char
typedef PCchar * PPCchar; // pointer to pointer to const char
我们可以参考《Effective c++》Item21上的做法:
1, 如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。
2, 如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 。
3, [3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的。
4, [4]为指针本身和指向的内容均为常量。
总结起来就是左常量右指针。