所以 this article正在讨论声明字符串文字的使用,例如 const char* foo = "foo"
它以声明结尾:
const char *foo = "foo";
is almost never what you want. Instead, you want to use one of the following forms:
- For a string meant to be exported:
const char foo[] = "foo";
- For a string meant to be used in the same source file:
static const char foo[] = "foo";
- For a string meant to be used across several source files for the same library:
__attribute__((visibility("hidden"))) const char foo[] = "foo";
我的理解是 const char* const foo = "foo"
等同于 const char foo[] = "foo"
只是因为我们在谈论永远不能更改为指向任何其他任何内容的 C 字符串指针,而 const char* foo = "foo"
可用于指向任何其他 C 字符串。
这是一个准确的概要吗?始终使用 const char* const
或 const char[]
?
最佳答案
让我们在这里学究气。
char const * const p_foo = "foo";
上面定义了一个指向{constant}字 rune 字“foo”的{constant}指针。指针指向字 rune 字的单个第一个字符。
const char bar[] = "bar";
- 上面定义了一个字符数组。
- 字符数组是*只读的。
- 字符数组是文本文字“bar”的长度加上一个 nul 终止符(4 个字符)。
- 文本文字的内容被复制到数组中。 (这 编译器可能会优化这一步)。
从根本上说,指向字面量第一个字符的指针和数组是有区别的。
指针指向一个单个字符。递增指针可能不会指向有效实体(因为它不是数组,而是指向单个数据的指针)。有一个基本假设,即指针可以递增到下一个字符。
有了数组,您就知道内存中有多个连续的字符(前提是数组的长度为 2 或更大)。您不知道序列(集合)中是否有终止 nul。您可以假设,但字符数组并不能保证这一点。
用法
通过数组声明,文本的长度在编译时已知。
对于指针声明,您需要使用 strlen
来确定运行时文本的长度。运行时代码不知道目标 数据字符串的长度;只能保证1的长度。
有时候,使用static
和const
可以帮助编译器优化。
例如:
static const char moo[] = "moo";
允许编译器直接访问文本,而无需创建数组变量并将文本复制到变量中。
在接收指向字符的指针的函数中,您不能保证指针指向有效位置(指针的内容可能无效)。
每个声明都有其优点和副作用。
选择权在你。
关于c++ - const char[] 和 const char* 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536666/