【问题标题】:How does conversion from string to char array work in C++?从字符串到字符数组的转换如何在 C++ 中工作?
【发布时间】:2021-03-11 21:46:37
【问题描述】:

我刚开始学习 C++,我试图通过 printf 输出一个字符串。 它不起作用,因为我必须先将字符串转换为 char 数组。 我用谷歌搜索了一下,似乎最好的解决方案是:

char *a = &b[0];

我有点理解:它获取对第一个字符的引用并将 a 设置为该字符。 我不明白的部分是,如果字符串存储在堆栈中,这对我来说才有意义,我知道有时可以。如果字符串在堆上,那么 [0] 索引究竟会返回什么?它是否将指针返回到第一个索引,因为 & 不是必需的吗?如果它返回字符,该字符不是采用堆栈上的单个值的形式,当被引用时,它不会给你正确的 char 数组?

【问题讨论】:

  • 谁说这是最好的解决方案而不是c_str 方法?
  • 附带说明,您不应该在 C++ 中使用printf,而是使用cout
  • @RemyLebeau 我听说 printf 更快。我还看到有人查看生成的二进制文件,而 printf 中的指令要少得多。如果 printf 更快,我真的没有理由不使用它。
  • @NikTedig printf() 可能比 cout 快(这是有争议的,这取决于正在执行的格式化类型),但这种速度部分是由于 printf() 没有比cout 更安全。为了性能,它更容易出现用户错误。
  • @RemyLebeau 什么样的用户错误?

标签: c++ string pointers char


【解决方案1】:

需要注意的是operator[] 返回一个引用

cppreference:

参考运算符[]( size_type pos );

返回对指定位置 pos 的字符的引用。

这很重要,因为它意味着b[0] 本质上是字符串中第一个字符的别名。然后,获取它的地址将为您提供一个指向存储字符串数据的底层缓冲区的指针。它在哪里(堆栈、堆等)并不重要。这也是使您可以使用例如修改字符串数据的原因。 b[0] = 'a';.

请注意,您还可以使用c_str()data() 来获取指向字符串中第一个字符的指针。由于 C++17 data() 可以返回一个非常量指针。

【讨论】:

  • OP 正在尝试将字符串传递给 printf()c_str(),而 const data() 可以正常工作。
  • @Kevin 好的,我想我现在明白了。我想我是因为缺少星号而感到困惑,据我所知,星号用于在 C++ 中设置指针后面的值。不过,数组不需要星号是有道理的。谢谢。
猜你喜欢
  • 2013-01-27
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多