什么是字符\*?

新手上路,请多包涵

为什么我们需要 *

 char* test = "testing";

据我了解,我们仅将 * 应用于地址。

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

阅读 4.3k
2 个回答

这是一个 char

 char c = 't';

它只能容纳 一个 char 演员!


这是一个 C 字符串:

 char s[] = "test";

它可以容纳 多个 char 。上面的另一种写法是:

 char s[] = {'t', 'e', 's', 't', 0};

末尾的 0 称为 NUL 终结符。它表示 C 字符串的结尾。


char* 存储了 C 字符串的起始内存位置。 1例如,我们可以用它来引用我们上面定义的同一个数组 s 。为此,我们将 char* 设置为 s第一个 元素的内存位置:

 char* p = &(s[0]);

& 运算符为我们提供了 s[0] 的内存位置。这是编写上述内容的更短的方法:

 char* p = s;

注意:

 *(p + 0) == 't'
*(p + 1) == 'e'
*(p + 2) == 's'
*(p + 3) == 't'
*(p + 4) == 0  // NUL

或者,或者:

 p[0] == 't'
p[1] == 'e'
p[2] == 's'
p[3] == 't'
p[4] == 0  // NUL


char* 的另一个常见用法是引用字符串 文字 的内存位置:

 const char* myStringLiteral = "test";

警告: 此字符串文字不应在运行时更改。我们使用 const 警告程序员(和编译器)不要以以下非法方式修改 myStringLiteral

 myStringLiteral[0] = 'b';  // Illegal! Do not do this for const char*!

这与上面的数组 s 不同, 我们 可以修改。这是因为字符串文字 "test" 在初始化阶段会自动复制到数组中。但是使用 myStringLiteral ,不会发生这样的复制。 (无论如何,我们会复制到哪里?没有数组来保存我们的数据……只是一个孤独的 char* !)


1技术说明: char* 仅存储类型为 char 的事物的内存位置。它当然可以只引用一个 char 。但是,更常见的是使用 char* 来指代 C 字符串,即 NUL 终止的字符序列,如上所示。

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

人们忘记提到的主要事情是 "testing" 是内存中的一个字符数组,在c++中没有原始字符串类型这样的东西。因此,与任何其他数组一样,您不能像引用它一样引用它是一个元素。

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

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