【问题标题】:What is a legal definition of a pointer to a pointer to a const object?指向 const 对象的指针的合法定义是什么?
【发布时间】:2021-12-09 00:42:39
【问题描述】:

我从this answer 知道指针const int** z 应该被读取为

变量z是[指向[指向const int对象的指针]的指针]。

以我的拙见,这意味着如果z=&y 那么y 应该是指向const int 对象的指针。但是,以下代码也可以编译:

int x=0;
int const* y=&x;
const int** z=&y;

为什么int const* 对象,即指向intconst 指针而不是指向const int 的指针可以作为z 的指向对象?

【问题讨论】:

    标签: c++ pointers constants


    【解决方案1】:

    您误解了 const 的含义。 const 总是引用它左边的元素 - 除非它是最左边的元素本身,它引用右边的元素。

    这意味着 int const * 是指向 const int 的指针,而不是您认为的指向 int 的 const 指针。要得到它,你必须写int * const

    int const *const int * 是完全相同的两种写法:指向 const int 的指针。

    如果您阅读从 rightleft 的声明,就会明白。如果 const 是最左边的元素,阅读时在其前面添加一个“that is”。例如:

    1. const int *:指向 const 的 int 指针。
    2. int const *:指向 const int 的指针。
    3. int * const:指向 int 的 const 指针。
    4. const int * const: 指向 int 的 const 指针,即 const。
    5. int const * const:指向 const int 的 const 指针。

    请注意,1/2 相同,4/5 相同。 1 和 4 被称为“west const”,因为 const 在西/左侧,而 2 和 5 被称为“east const”。

    【讨论】:

    • 非常感谢您的解释,我现在明白了 int const* 中的 * 表示指向 const int 对象的指针,而 int* const 中的 * 表示 (const) 指针到int
    【解决方案2】:

    为什么是 int const* 对象,即 const 指向 int 的指针

    没有。

    int const *const int * 是同一类型。

    人们有时更喜欢写 int const *,因为它从右到左读作 “指向 const int 的指针”,而 const int * 真正读作 “指向 int (这是 const)".

    指向intconst 指针是int * const

    试试看:

      int a = 42;
      const int * y = &a;
      int const * z = &a;
    
      *y = 24; // compile error assigning to const
      *z = 24; // compile error assigning to const
    
      int b = 0;
      y = &b;
      z = &b; // re-pointing non-const pointers is fine
      *z = 1; // still a compile error
    
      int * const x = &a;
      *x = 24; // fine, assigning via pointer to non-const
      x = &b;  // error reassigning a const pointer
    

    【讨论】:

    • 啊,谢谢!我现在意识到我的错误在哪里,并且这两个符号是相同的事实~
    猜你喜欢
    • 2011-01-14
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多