哇,有很多'const'正在发生。
int * const foo1
foo1
是“指向 int 的 const 指针”。的值foo1
是恒定的。foo1
指向什么可能会改变。
int const foo2
const int foo3
foo2
并且foo3
是相同的类型——两者都是正确的——C 允许两者。int
和的 顺序const
是 一种风格 选择. 在这两种情况下,标识符都是恒定的。 根据我的经验,拥有const
第一更常见。因此,我倾向于遵循现有技术。此外 - 只要它与模块一致,我发现任何一个都可以。在这两种情况下,人们都希望找到一个像const int foo3 = 7;
但也需要解开一些混乱。
[编辑答案如下]
// OP's experimented with these
int * const * foo4;
int const * foo5;
OP 推测“const 限定其左侧的类型,就像其左侧没有类型一样,它应限定右侧部分”。这对于这两个是可以解释的,并且似乎适用于其他示例:
foo4
是一个“指向 const 指向 int 的指针”。
foo5
是“指向 const int 的指针”。
附加样本:
int * const foo6;
const int* foo7;
int const * const foo8;
foo6
是“指向 int 的 const 指针”。
foo7
是“指向 const int 的指针” - 与foo5
.
foo8
是“指向 const int 的 const 指针”。
foo6
是恒定的,它指向的数据不是恒定的。
foo7
不是常数,它指向的数据被视为常数。是恒定的。它指向的数据被视为常量。
foo8
@ugoren在关于跨 a移动的帖子中是正确的。移动改变类型。这不是风格差异,而是不同的代码。const
*
const
参考:
C11 6.2.5.29 “示例 1 指定为 ''float *'' 的类型具有类型 ''pointer to float''。它的类型类别是指针,而不是浮点类型。这种类型的 const 限定版本被指定为 ' 'float * const'' 而指定为 ''const float *'' 的类型不是限定类型 - 它的类型是 ''pointer to const-qualified float'' 并且是指向限定类型的指针。
C11 6.7
http://cdecl.org/