我在理解指向指针等情况下的const时遇到了一些困难。 也就是说,当你有
const Foo **foo;
我可以在 **foo 中更改一些内容吗?例如:foo[0]->bar = 12;
还有:
const Foo ***foo;
Foo **const foo;
我在理解指向指针等情况下的const时遇到了一些困难。 也就是说,当你有
const Foo **foo;
我可以在 **foo 中更改一些内容吗?例如:foo[0]->bar = 12;
还有:
const Foo ***foo;
Foo **const foo;
const int **foo;
declare foo as pointer to pointer to const int
int * const * const foo;
declare foo as const pointer to const pointer to int
这是一个指向非 const int 的 const 指针的 const 指针,您无法更改指向的值,但它可以被更改。
C 语言使用 顺时针/螺旋规则 来解析变量左侧只有修饰符的情况(如 foo),您需要从右向左阅读:
int(5) *(4) const(3) *(2) const(1) foo;
foo
是一个指向整数(5)的常量(1)指针(2),指向的又是一个指向常量(3)的指针(4)。
int(6) const(5) *(4) const(3) *(2) const(1) foo;
const(6) int(5) *(4) const(3) *(2) const(1) foo; // [same as above]
foo
是一个指向常量(1) 指针(2),该指针又指向一个常量(3) 整数(6) [或者指向一个是常量的(6) 整数(5)].const
关键字应用于表达式**foo
,因此foo
和*foo
可写,但**foo
不可写。
一些其他的例子:
const Foo * const *foo; // foo is writable, *foo and **foo are not
Foo * const * foo; // foo and **foo are writable, *foo is not
Foo * const * const foo; // **foo is writable, foo and *foo are not
const Foo * const * const foo; // none of the expressions are writable
const Foo * * foo
(或者 Foo const * * foo
)是指向常量 Foo 的指针的指针。
Foo * const * foo
是指向 Foo 指针的常量指针。
Foo * * const foo
是指向指针的常量指针,该指针指向 Foo。
我认为编写这种类型表达式最简单的方法是始终将const
应用于左侧。你提供的那个也可以写成:
Foo const**foo;
这里的const
只适用于剩下的部分,因此是Foo
。
Foo *const* foo;
这里左边是Foo*
Foo const*const* foo;
则变成了 ((Foo const)*const)*
。
当你想要阅读这样的表达式时,如果必要的话,交换 const
和裸类型的位置,以使 const
出现在右侧。
Foo const foo
。Foo const *foo
。Foo *const foo
。 - Matt Joinerconst Foo **foo
中,实际上是 Foo
对象是常量。因此你可以改变 foo
,也可以改变 *foo
,但是你不能改变 **foo
。const Foo ***foo
,你可以改变 foo
,*foo
和 **foo
,但是不能改变 ***foo
。Foo **const foo
,你可以改变 *foo
和 **foo
,但是不能改变 foo
本身。从内向外读取类型。 从 foo
开始, const Foo ** foo;
读取 *
(指针)到 *
(指针)到 const Foo
(您不允许修改的Foo对象)。 Foo ** const foo;
读取 const
(不可修改) *
(指针)到 *
(指针)到 Foo
(一个Foo对象)。