【问题标题】:What's the meaning of multiple const qualifiers?多个 const 限定符是什么意思?
【发布时间】:2024-05-01 07:40:02
【问题描述】:

代码:

const char* const* const* foo(int bar);

我之前也看到过双重常量,它也阻止了指针的修改。我一生中第一次看到三重常量。想知道它的用途是什么。

【问题讨论】:

  • 你可以有一个const作为基本类型加上一个const,每个*;所以const char *const *const *const foo(int bar); 是有效的。
  • 表示每一级指针间接都是const
  • 为什么有人需要常量指针指向常量指针?
  • @LukášRutar:同样的原因你可能需要const 任何东西。
  • 使用cdecl translator

标签: c constants declaration function-signature


【解决方案1】:

在您的示例中,除了*间接所有 const 合格。

const char            /* const qualified base level */
    *const            /* const qualified level 1 */
    *const            /* const qualified level 2 */
    *                 /* regular level 3 */
    foo(int bar);

foo 是一个接受 int 参数并返回常规指针的函数。
它返回的指针指向一个const 限定指针
它又指向另一个 const 限定指针
指向const合格的char

【讨论】:

  • 最喜欢这个答案 :) 谢谢!
  • 当你完全取消引用那种指针所指向的数据时,我想看看你的内存层次结构的面貌...... :)
【解决方案2】:

如果你有一个多级指针,你就有几个指针变量。示例:

char*** foo;

这样访问:

| foo | pointer1 | pointer2 | string |
   |    ^     |    ^     |    ^
    \___/      \___/      \___/

您可以将内存中的四个位置中的每一个都限定为const,如声明中所述

const char *const *const *const foo;

但是,最好避免成为三星级程序员。

【讨论】:

  • 我看到的char *** 的主要(理智)使用是在建模“out”参数时告诉调用者有关字符串数组的信息。将所有这些consts 洒在那里只会让一切变得更加混乱......
  • @DonalFellows 是编写此代码的“三星级程序员”,您说得对,它旨在传递一个字符串数组。但是,您错了,它只会增加混乱。它可以防止用户代码弄乱该数组或其包含的字符串之一。
  • @fstd 我也知道如何使用 multi-const。还是吓坏了马。
  • @DonalFellows 我没有向你解释它是如何工作的,我是在证明使用的合理性。看不出它有多可怕——相比之下,省略 const 会导致可怕的情况。这是库代码。
【解决方案3】:

哈 - const 周围的混乱。

基本上,如果它限定一个指针,那么它适用于紧靠其左侧的指针。例如:

char *const c;

使c 成为指向char 的只读指针,而

const char *c;

使c 成为指向只读char 的指针,但您可以更改c 指向的位置。

当然,指针和它所指向的内容都可以设为只读:

const char *const c;

这使得c 成为一个只读指针,指向只读char。使用前面的声明,你可以修改*c,但你不能修改c(即你不能让它指向其他地方)。使用第二个,您可以分配给c,但不能分配给*c,使用第三个,您不能修改它指向的位置,也不能修改指向的对象。

这扩展到多个间接级别。对于您的情况,您可能希望将 const 关键字与它们符合条件的匹配指针重新组合。这主要是一个空格问题,但它会是这样的:

const char *const *const *foo(int bar);

这使得foo 返回一个指向只读指针的指针,该指针指向一个指向只读char 的只读指针。仔细阅读:注意给定这段代码:

const char *const *const *ptr = foo(0);

那么你知道分配给ptr是合法的,但是任何其他分配都是非法的,即你不能分配给*ptr**ptr***ptr

【讨论】:

  • "xpto" 不是const char* const* const 时,我看不出ptr = "xpto" 是如何合法的。
  • @LightnessRacesinOrbit 哎呀。完全同意。已删除该部分,感谢您的反馈。
  • constconst char * 中什么都没有了。
  • @JanHudec const 没有限定指针,因此该参数不适用(仅当 const 限定指针时才说)。但如果你愿意,你也可以写成char const *
【解决方案4】:

foo 返回一个pointer,它指向一个constant pointer,它指向另一个constant pointer,它指向一个constant char。看看spiral rule

int bar;
const char* const* const* ptr = foo(bar);

所以基本上你不能改变*ptr**ptr***ptr中的任何一个。

【讨论】: