指向指针的const限定符

4

我在理解指向指针等情况下的const时遇到了一些困难。 也就是说,当你有

 const Foo **foo;

我可以在 **foo 中更改一些内容吗?例如:foo[0]->bar = 12;

还有:

 const Foo ***foo;
 Foo **const foo;
6个回答

9
您可以使用cdecl来理解C语言声明的含义。
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)].

3

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

1

const Foo * * foo(或者 Foo const * * foo)是指向常量 Foo 的指针的指针。

Foo * const * foo 是指向 Foo 指针的常量指针。

Foo * * const foo 是指向指针的常量指针,该指针指向 Foo。


@sje: const Foo *const *const foo; - Stuart Golodetz

1

我认为编写这种类型表达式最简单的方法是始终将const应用于左侧。你提供的那个也可以写成:

Foo const**foo;

这里的const只适用于剩下的部分,因此是Foo

Foo *const* foo;

这里左边是Foo*

Foo const*const* foo;

则变成了 ((Foo const)*const)*

当你想要阅读这样的表达式时,如果必要的话,交换 const 和裸类型的位置,以使 const 出现在右侧。


这是我写代码的方式,const 始终在右侧。 Foo const fooFoo const *fooFoo *const foo - Matt Joiner

0
const Foo **foo 中,实际上是 Foo 对象是常量。因此你可以改变 foo,也可以改变 *foo,但是你不能改变 **foo
对于 const Foo ***foo,你可以改变 foo*foo**foo,但是不能改变 ***foo
对于 Foo **const foo,你可以改变 *foo**foo,但是不能改变 foo 本身。

0

从内向外读取类型。 从 foo 开始, const Foo ** foo; 读取 * (指针)到 * (指针)到 const Foo (您不允许修改的Foo对象)。 Foo ** const foo; 读取 const (不可修改) * (指针)到 * (指针)到 Foo (一个Foo对象)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接