用于指针指针的const限定符

当你应用于指针指针等时,我在推断const是什么时遇到了一点麻烦,也就是说当你有什么是const时

const Foo **foo; 

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

关于什么:

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

您可以使用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使用顺时针/螺旋规则 ,如果你在变量(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)]。

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 )是指向const Foo的指针。

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

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

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

 Foo const**foo; 

这里的const只适用于剩下的东西,因此也就是Foo

 Foo *const* foo; 

左边是Foo*

 Foo const*const* foo; 

然后是((Foo const)*const)*

当你想要读取这样的表达式时,如果需要,将const和bare类型交换为右边的const

const Foo **foo ,它是实际的Foo对象,它是const。 所以你可以改变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对象)。