【问题标题】:C++ * const *constC++ * 常量 *常量
【发布时间】:2014-02-13 07:01:09
【问题描述】:

我试图为此搜索答案,但我发现很难找到此类“确切”示例。我对指向指针的指针知之甚少,我觉得这不仅仅是指向某物的指针。

那么你们会怎么翻译呢?

void free(shame_1 * const * const group_1);

如果我将其翻译为 const group_1 指向 const 指向羞耻_1 的指针,是否正确?

谢谢。

【问题讨论】:

  • group_1 只是变量的名称。所以该变量的类型是指向shame_1 的常量指针的常量指针。这里定义常量的方式意味着你不能改变group_1的值,也不能改变*group_1的值,但是你可以改变**group_1的值。
  • 如果您在阅读 C/C++ 声明时遇到问题,请查看spiral rule
  • 我的一位同事给了我一个对我帮助很大的提示:“从右到左阅读类型”。现在我知道它解决了很多困惑:)
  • 非常感谢你们快速准确的回答!还要感谢这篇文章下的答案,因为我不想使用答案按钮。我以为这个网站用粗手来处理学徒,但我错了。当我在脑海中融化这些信息时,我稍后会发布正确的答案。我还想知道是否有某种方法可以在 C# 中做这件事?如果您不介意回答,也谢谢您。
  • 如果你看到 C 乱码快要爆炸了,你总是可以退回到cdecl:cdecl explain 'int * const * const group_1'

标签: c++ pointers constants


【解决方案1】:
shame_1 * const * const group_1;

声明一个名为 group_1 的变量,它的类型是一个 const 指针(您无法更改它指向的位置),指向另一个指向一个 shade_1 类型对象的 const 指针(相同),您实际上可以更改其值。

因此,例如,您无法编译:

group_1 = nullptr;
*group_1 = nullptr;

但是,您可以这样做:

void f(shame_1& group) {
    //stuff that modifies group
    ...
}
f(**group1);

正如 zakinster 所说,查看 the spiral rule 应该有助于您理解这种表示法。

【讨论】:

    【解决方案2】:

    一般来说,从右到左阅读:

    void free(shame_1 * const * const group_1);
    

    free 接受一个名为 group_1 的参数,它是一个 const 指针,指向一个 const 指针,指向一个 shame_1 对象。

    • 这里不相关,但是从右到左阅读的主要麻烦是有些人使用T const *,而其他人使用const T*,它们的意思相同,所以无论你看到T const还是@987654330 @你应该把它读成const T。在您的代码中,无论如何只有指针是 const

    例如:

    shame_1 a_shame;
    const shame_1* p_a_shame = &a_shame;
    free(&p_a_shame);
    

    在这方面几乎没有什么用处...free() 可以接受指向 shame_1const 指针,而无需额外的间接级别,并且仍然能够对 @ 执行所有相同的操作987654337@,所以它只有在free() 必须将const-pointer-to-const-指针传递给其他函数时才有用(最终没有充分的理由造成整个混乱)。

    您可以将内存使用/关系可视化为:

    [a_shame]  <------ [p_a_shame]  <------  [group_1]*
    
    • 这可能只存在于 CPU 寄存器中,但其他可能在优化后也是如此。

    如果我将其翻译为 const group_1 指向 const 指向羞耻_1 的指针,是否正确?

    所以,对我来说,“const group_1 指针”位有点可疑……我认为它读起来更好,因为“group_1 是指向……的 const 指针”或“指向……的 const 指针(称为 group_1)” ”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2013-05-17
      • 2011-06-27
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多