当应用于指针指针等时,我在推断const是什么时有点麻烦。 即,当你有
时,const是什么 const Foo **foo;
我可以在这里改变** foo的东西吗?如foo[0]->bar = 12;
怎么样:
const Foo ***foo;
Foo **const foo;
答案 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对象)。