【问题标题】:Why is this Pointer to Constant Pointer assignment Illegal?为什么这个指向常量指针的指针分配是非法的?
【发布时间】: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 - 它可以在不使用螺旋读取规则的情况下声明指针。

标签: c++ pointers constants


【解决方案1】:

您需要习惯使用指针声明的是,您需要尝试从右到左阅读它们。重要的是* 两边的内容

int * const p 表示 p 是一个 const 指针,指向一个 non-const int

const int **p1 表示p1 是一个非常量指针,指向一个非常量指针,指向一个const int

您的第二个声明失败,因为它从一个 const 变量创建了一个非常量变量。

【讨论】:

  • 几乎正确,根据你的最后一句话,这不应该工作:const int x = 3; int y = x;
  • 我明白你在说什么,但即使这样也行不通,似乎遵循这个逻辑:const int ci = 42; const int * const p3 = &ci; const int ** p = &p3;
  • 在顶层,它是一个副本,所以 const 无关紧要。被“包裹在”指针或引用棒内的 const。获取某个 const 的地址不能分配给包含某个非 const 的地址的东西,或者您最终可能会通过通过非 const 镜头查看它来更改 const 值(没有演员表)。跨度>
  • @ChrisUzdavinis 是的,感谢您澄清我未能详细说明的地方
【解决方案2】:

用文字10初始化新的可变intx,很好:

int x = 10;

初始化指向可变intp的新常量指针,地址为x,很好:

int * const p = &x;

将新的可变指针初始化为指向常量int 的可变指针,地址为p,由于剥离const 以及添加最内层const 导致的约束违规:

const int **p1 = &p;
// Normally qualifiers go to the right of the type they qualify
// The inner-most qualifiers can be put before them though without introducing ambiguity

Read the full rules on cppreference.com或者直接在标准里,有点长。

【讨论】:

  • "并且由于添加了最里面的 const" 添加 const 应该不是问题,删除是
  • @Slava 可以,在这种情况下是个问题。请参阅链接了解细节。
【解决方案3】:

声明 2 个常量:

int const x1 = 3;
const int x2 = 3;

声明一个指针,其数据不能通过指针改变:

const int *p = &someInt;

声明一个不能被改变为指向别的东西的指针:

int * const p = &someInt;

链接:const int = int const?

【讨论】:

    【解决方案4】:

    编译器(这里是 gcc)告诉你

    invalid conversion from 'int* const*' to 'const int**' [-fpermissive]
    

    原因是

    p1 是指向(非const)的指针,指向const int

    同时

    p 是一个 const 指向 int 的指针

    如果赋值是合法的,你可以修改 const 变量 pp1(因为 *p1 的类型是 const int * -- 指向 const int 的指针)。

    【讨论】:

      【解决方案5】:

      int * const p = &x;

      这意味着地址/引用是恒定的,因为const* 之后(与目标值是恒定的相反,换句话说const* 之前,换句话说const int *p )

      const int **p1 = &p;

      这意味着p1,我称之为“外部指针”指向const int *,这是错误的,b.c。正如前面的表达式所述,它应该指向int *const

      换句话说,正如编译器所说,

      error: cannot initialize a variable of type 'const int **' with an rvalue of type 'int *const *'
      const int **p1 = &p;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 2017-06-12
        • 1970-01-01
        • 2020-10-23
        • 2011-01-14
        • 2017-03-07
        • 2013-01-04
        • 1970-01-01
        相关资源
        最近更新 更多