【发布时间】:2014-03-11 17:51:36
【问题描述】:
int const *a 和const int *a 分别表示“a 是指向常量值的整数指针”和“a 是指向常量地址的指针”,还是相反?
这是在一次采访中问我的。在阅读了很多相同的内容之后,我仍然对此感到非常困惑。
【问题讨论】:
-
在 C++ 中,通常不是阅读“大量”内容,而是阅读正确的内容 :-)
int const *a 和const int *a 分别表示“a 是指向常量值的整数指针”和“a 是指向常量地址的指针”,还是相反?
这是在一次采访中问我的。在阅读了很多相同的内容之后,我仍然对此感到非常困惑。
【问题讨论】:
当const 跳过类型关键字(int)时,含义不会改变。
当const 跳过* 时,含义会发生变化。
const int *a; /* The int is const */
int const *b; /* The int is const */
int *const c; /* The pointer is const */
【讨论】:
const int *a - a 是可写的(可以指向不同的东西),*a 是不可写的(不能写入指向的东西)int const *a - 同上int * const a - a 不可写(不能指向不同的东西),*a 是可写的(可以写指向的东西)const int * const a - a 和 *a 都不可写int const * const a - 同上如果你把前两种情况读成
const int (*a)
int const (*a)
很明显const 正在修改int 类型说明符;我们指向一个常量整数。
如果你把第三种情况读作
int (* const a)
那么const正在修改指针声明符*a;我们有一个指向整数的常量指针。
那么你把最后两种情况读作
(const int) (* const a)
(int const) (* const a)
那么很明显,我们有一个const 修改类型说明符,另一个修改指针,所以我们有一个常量指针指向一个常量整数。
【讨论】:
const int *a 表示a 是一个非const 指向const 对象的指针,而int * const a 表示a 是一个指向非的const 指针-const 对象。
int const *a;
相当于:
const int *a;
表示a 是指向const int 对象的指针。
【讨论】: