这是一个 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 许可协议
这是一个
char
:它只能容纳 一个
char
演员!这是一个 C 字符串:
它可以容纳 多个
char
。上面的另一种写法是:末尾的
0
称为NUL
终结符。它表示 C 字符串的结尾。char*
存储了 C 字符串的起始内存位置。 1例如,我们可以用它来引用我们上面定义的同一个数组s
。为此,我们将char*
设置为s
的 第一个 元素的内存位置:&
运算符为我们提供了s[0]
的内存位置。这是编写上述内容的更短的方法:注意:
或者,或者:
char*
的另一个常见用法是引用字符串 文字 的内存位置:警告: 此字符串文字不应在运行时更改。我们使用
const
警告程序员(和编译器)不要以以下非法方式修改myStringLiteral
:这与上面的数组
s
不同, 我们 可以修改。这是因为字符串文字"test"
在初始化阶段会自动复制到数组中。但是使用myStringLiteral
,不会发生这样的复制。 (无论如何,我们会复制到哪里?没有数组来保存我们的数据……只是一个孤独的char*
!)1技术说明:
char*
仅存储类型为char
的事物的内存位置。它当然可以只引用一个char
。但是,更常见的是使用char*
来指代 C 字符串,即NUL
终止的字符序列,如上所示。