【发布时间】:2018-06-05 19:08:42
【问题描述】:
int x = 10;
int * const p = &x;
const int **p1 = &p;
无法理解为什么这是非法的。
编辑
感谢您提供的所有出色答案。 这是我对答案的解释,请随时不同意。 所以,错误在第三行。这意味着原始整数是常量,但并不意味着它指向的指针是常量,因此这是非法的,因为我们可以尝试通过“p1”更改指针“p”,这是不可能的,因为这是一个常量指针。所以要解决这个问题,第三行必须是:
int * const *p1 = &p;
这是有效的,因为它说虽然原始整数是非常量(可变),但它指向的指针是常量,因此它是合法的声明。所以这也是合法的:
const int * const *p1 = &p;
除了它还说您不能更改原始整数,因为它是常量之外,这说明了同样的事情。
【问题讨论】:
-
你对
int * const p的意图是什么? -
当出现错误消息时,您应该将其包含在问题中,通常他们已经给出了错误提示
-
@tadman 实际上是相反的——
int * const p创建了一个指向可变值的 const 指针,然后他尝试获取一个指向 const 值的可变指针的可变指针。 -
@VTT 您已经正确解释了。这个符号真的很不寻常,这就是我感到困惑的原因。
-
@tadman 您可能需要检查Straight declarations library - 它可以在不使用螺旋读取规则的情况下声明指针。