【问题标题】:Why can we not define a low + top-level const pointer to a pointer to int?为什么我们不能定义一个指向 int 指针的低 + 顶级 const 指针?
【发布时间】:2013-04-14 07:22:38
【问题描述】:
  1. 定义 int 和指向 int 的指针:

    int i = 22, *p = &i;

  2. 定义低级和顶级const指针:

    const int *const cp = p;

    (2) 没问题 - 无权更改 (of i) 值的 const 点

  3. 定义一个指向low+top-level const的指针:

    const int **const cp_2_p = &p;

    (3) 不行,为什么?

    error C2440: 'initializing' : cannot convert from 'int **' to 'const int **const

我希望能够定义一个指向 int 的指针的指针,我无法更改它指向的地址,也无法更改它指向的地址。

【问题讨论】:

  • “高”和“低”级别指针是什么意思?
  • 另请参阅here,了解为什么将int ** 转换为int const ** 是个坏主意。
  • @KirilKirov - 不是高低级指针 -> 高和/或低级常量;但我错了,它被称为“顶级”和“低级”;顶级意味着您不能更改地址。低级意味着您不能更改该地址中的值。
  • @zehelvion 你倒退了。低级 const 表示地址不能更改,顶级 const 表示值不能更改。

标签: c++


【解决方案1】:

通常,const 应用于其左侧的项目。 const T 的例外是由于历史原因而出现的,并且是 T const 的常规替代方案。

cp 被声明为一个 constant 指针,指向一个常量 int

cp_2_p 被声明为一个常量指针,指向一个 非常量 指向一个常量 int 的指针。

您需要像这样声明 cp_2_p 以使类型兼容:

const int *const *const cp_2_p

【讨论】:

  • 或作为“const int *const *”,用于指向“const pointer to const int”的非常量指针。
  • @dascandy - 非常感谢,当涉及到指针的指针时,这确实掩盖了所有顶级低级 const “奥秘”。所以在 ** - 第一个 * 是指我指向的指针,第二个是我要声明的指针,对吗?
  • @ArthurWulfWhite 是的,没错。从右到左阅读。这也是为什么“int const”在这方面稍微更正确的原因,它从右到左更容易阅读。
  • @dascandy 好吧,我又困惑了。我可以有一个指向非常量指针的常量指针,但我不能有一个指向常量值的非常量指针的常量指针?
  • 不,当然可以。 "(1) int (2) * (3) * (4)" => (1) 和 (2) 是同一个位置,这就是 "int" 是否为 const。 (3) 表示指向int的指针是否为const。 (4) 指示指向 int 指针的指针是否为 const。您可以无限扩展列表,但通常不需要超过 2 个 *。顺便说一句,“volatile”也使用相同的位置。
猜你喜欢
  • 2015-09-10
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多