如果它有帮助(而且可能没有),以下是同义词,利用允许打开类型有const 出现在紧靠左侧的语言细节或 类型的右侧,但在任何其他限定符(如指针或引用)之前:
const int * p; // does NOT require initialization
int const * q; // same as above
两者都声明指向常量int数据的指针,并且在语法上可以互换。
而这个:
int * const p = &a; // requires initialization.
声明一个指向int数据的常量指针; 不是指向常量int 数据的指针。
进一步扩展(实际上合并两者),我们得到:
const int * const p = &a;
int const * const p = &a;
这些是同义词。两者都声明了一个指向常量 int 数据的常量指针。指针和它指向的东西都是不可修改的,都需要初始化。
无耻地抄袭图表
以下内容是从一个轻微相关的question 我自己(好吧,没那么丢脸)无耻地扯掉的。我希望它有助于进一步解释当您将 const 和 * 放置在声明的不同位置时会发生什么差异:
单间接:
char *p; // p is mutable, *p is mutable
const char *p; // p is mutable, *p is const
char const *p; // same as above.
char *const p; // p is const, *p is mutable, must be initialized.
char const *const p; // p is const, *p is const, must be initialized.
双重间接:
char **p; // ptr-to-ptr-to-char
// p, *p, and **p are ALL mutable
const char **p; // ptr-to-ptr-to-const-char
// p and *p are mutable, **p is const
char const **p; // same as above
char *const *p; // ptr-to-const-ptr-to-char
// p is mutable, *p is const, **p is mutable.
char **const p; // const-ptr-to-ptr-to-char
// p is const, *p is mutable, **p is mutable.
// must be initialized.
const char **const p; // const-ptr-to-ptr-to-const-char
// p is const, *p is mutable, **p is const.
// must be initialized.
char const **const p; // same as above
char const *const *p; // ptr-to-const-ptr-to-const-char
// p is mutable, *p is const, **p is const.
const char *const *p; // same as above.
char *const *const p; // const-ptr-to-const-ptr-to-char
// p is const, *p is const, **p is mutable.
// must be initialized.
还有我个人最喜欢的:
char const *const *const p; // const-ptr-to-const-ptr-to-const-char
// everything is const.
// must be initialized.
const char *const *const p; // same as above