\`const char \* const\` 与 \`const char \*\`?

新手上路,请多包涵

我正在运行一些示例程序来重新熟悉 C++,我遇到了以下问题。首先,这是示例代码:

 void print_string(const char * the_string)
{
    cout << the_string << endl;
}

int main () {
    print_string("What's up?");
}

在上面的代码中, print_string 的参数可能是 const char * const the_string 。哪个更正确?

我知道区别在于一个是 pointer to a constant character ,而另一个是 constant pointer to a constant character 。但为什么这两种方法都有效?什么时候相关?

原文由 pict 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
2 个回答

后者阻止您修改 the_string 内部 print_string 。它实际上在这里是合适的,但也许冗长推迟了开发人员。

char* the_string :我可以更改哪个 char the_string 指向,我可以修改 char 指向的 —1ab9b4da34b4c1253c 8.3ecfbca

const char* the_string : I can change which char the_string points to, but I cannot modify the char to which it points.

char* const the_string : I cannot change which char the_string points to, but I can modify the char to which it points.

const char* const the_string :我无法更改哪个 char the_string 指向,我也不能修改 char 指向的 —015180010a530749b.

原文由 Kent Boogaart 发布,翻译遵循 CC BY-SA 4.0 许可协议

(我知道这是旧的,但我还是想分享。)

只是想详细说明托马斯马修斯的答案。 C 类型声明的左右规则几乎说:当阅读 C 类型声明时,从标识符开始,可以时向右,不能时左。

最好用几个例子来解释这一点:

示例 1

  • 从标识符开始,我们不能向右走,所以我们向左走
  const char* const foo
              ^^^^^

foo 是一个 常数

  • 继续向左
  const char* const foo
            ^

foo 是一个指向…的常量 指针

  • 继续向左
  const char* const foo
        ^^^^

foo 是一个指向 char 的常量指针…

  • 继续向左
  const char* const foo
  ^^^^^

foo 是指向 char 常量 的常量指针(完成!)

示例 2

  • 从标识符开始,我们不能向右走,所以我们向左走
  char* const foo
        ^^^^^

foo 是一个 常数

  • 继续向左
  char* const foo
      ^

foo 是一个指向…的常量 指针

  • 继续向左
  char* const foo
  ^^^^

foo 是指向 char 的常量指针(完成!)

示例 1337

  • 从标识符开始,但现在我们可以正确了!
   const char* const* (*foo[8])()
                          ^^^

foo 是 8 个数组

  • 打括号,所以不能再向右了,向左走
  const char* const* (*foo[8])()
                      ^

foo 是一个包含 8 个 指针的数组,指向

  • 在括号内完成,现在可以向右走
  const char* const* (*foo[8])()
                              ^^

foo 是一个由 8 个指针组成的数组,指向 返回

  • 没有更多的右边,向左走
  const char* const* (*foo[8])()
                   ^

foo 是一个包含 8 个函数指针的数组,该函数返回 一个指向

  • 继续向左
  const char* const* (*foo[8])()
              ^^^^^

foo 是一个由 8 个指向函数的指针组成的数组,该函数返回一个指向 常量 的指针……

  • 继续向左
  const char* const* (*foo[8])()
            ^

foo 是一个包含 8 个函数指针的数组,该函数返回一个指向一个常量 指针的指针,该指针指向一个

  • 继续向左
  const char* const* (*foo[8])()
        ^^^^

foo 是一个包含 8 个函数指针的数组,该函数返回一个指向 char 的常量指针的指针…

  • 继续向左
  const char* const* (*foo[8])()
  ^^^^^

foo 是一个包含 8 个函数指针的数组,这些函数返回一个指向 char 常量 的常量指针(完成!)

进一步解释: http ://www.unixwiz.net/techtips/reading-cdecl.html

原文由 Garrett 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题