何时使用 const char \* 以及何时使用 const char \[\]

新手上路,请多包涵

我知道它们是不同的,我知道它们有何不同,并且我阅读了所有我能找到的关于 char*char[] 的问题

但是所有这些答案都没有说明何时应该使用它们。

所以我的问题是:

你什么时候用

const char *text = "text";

你什么时候用

const char text[] = "text";

有什么指导方针或规则吗?

例如,哪个更好:

 void withPointer()
{
    const char *sz = "hello";
    std::cout << sz << std::endl;
}

void withArray()
{
    const char sz[] = "hello";
    std::cout << sz << std::endl;
}

(我知道 std::string 也是一个选项,但我特别想知道 char 指针/数组)

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

阅读 406
2 个回答

两者明显不同,首先:

  1. First 创建一个指针。
  2. 第二个创建一个数组。

继续阅读以获得更详细的解释:

数组版本:

 char text[] = "text";

创建一个足够大的数组来保存字符串文字“text”,包括它的 NULL 终止符。数组 text 用字符串文字“text”初始化。 该数组可以在以后修改。此外,即使在编译时数组的大小也是已知的,因此 可以使用 sizeof 运算符来确定其大小。


指针版本:

 char *text  = "text";

创建一个指向字符串文字“text”的指针。这比数组版本快, 但指针指向的字符串不应更改,因为它位于只读实现定义的内存中。修改这样的字符串文字会导致 Undefined Behavior

事实上,C++03 不赞成使用没有 const 关键字的字符串文字。所以声明应该是:

 const char*text = "text";

此外,您 需要使用 strlen() 函数,而不是 sizeof 来查找字符串的大小, 因为 sizeof 运算符只会给您指针的大小多变的。


哪个版本更好?

取决于使用情况。

  • 如果您不需要对字符串进行任何更改,请使用指针版本。
  • 如果您打算更改数据,请使用数组版本。

编辑:我刚刚注意到(在评论中)OP寻求以下区别:

const char text[]const char* text

好吧,除了关于修改字符串文字的那一点之外,上述不同点仍然适用。使用 const 限定符,数组 test 现在是一个包含 const char 类型元素的数组,这意味着它们不能被修改。

鉴于此,我会选择数组版本而不是指针版本,因为指针可以(错误地)轻松地重新定位到另一个指针,并且可以通过另一个指针修改字符串,从而导致 UB。

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

几年前,Ulrich Drepper 的博客文章给了我很大帮助:

如此接近但没有雪茄更多的乐趣

该博客的要点是 const char[] 应该是首选,但只能作为全局或静态变量。

使用指针 const char* 有以下缺点:

  1. 附加变量
  2. 指针可写
  3. 额外的间接
  4. 通过指针访问字符串需要 2 次内存加载

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

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