指向指针的const限定符

时间:2010-11-22 14:30:19

标签: c

当应用于指针指针等时,我在推断const是什么时有点麻烦。 即,当你有

时,const是什么
 const Foo **foo;

我可以在这里改变** foo的东西吗?如foo[0]->bar = 12;

怎么样:

 const Foo ***foo;
 Foo **const foo;

6 个答案:

答案 0 :(得分:8)

您可以使用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指针的cosnt指针,指向非const int:你不能改变指向值,但它可以改变。


C使用Clockwise/Spiral Rule,如果您在变量(foo)的左侧只有修饰符,则会读取从右到左的内容:

int(5) *(4) const(3) *(2) const(1) foo;

foo是常量(1)指针(2)到常量(3)指针(4)到整数(5)。

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)指针(4)到常量(5)整数(6)[或整数(5),这是常数(6)]。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

Foo const**foo;

此处const仅适用于剩下的内容,因此Foo

Foo *const* foo;

左侧是Foo*

Foo const*const* foo;
然后

((Foo const)*const)*

当您又想要阅读这样的表达式时,如果需要,请将const和裸类型交换为右侧的const

答案 4 :(得分:0)

const Foo **foo中,它是实际的Foo对象,它是const。因此,您可以更改foo,然后您可以更改*foo,但无法更改**foo

对于const Foo ***foo,您可以更改foo*foo**foo,但不能更改***foo

对于Foo **const foo,您可以更改*foo**foo,但不能更改foo本身。

答案 5 :(得分:0)

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