c++ - const char[] 和 const char* 的区别

标签 c++ arrays pointers constants c-strings

所以 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* constconst char[]

最佳答案

让我们在这里学究气。

char const * const p_foo = "foo";

上面定义了一个指向{constant}字 rune 字“foo”的{constant}指针。指针指向字 rune 字的单个第一个字符。

const char bar[] = "bar";
  • 上面定义了一个字符数组。
  • 字符数组是*只读的。
  • 字符数组是文本文字“bar”的长度加上一个 nul 终止符(4 个字符)。
  • 文本文字的内容被复制到数组中。 (这 编译器可能会优化这一步)。

从根本上说,指向字面量第一个字符的指针和数组是有区别的。

指针指向一个单个字符。递增指针可能不会指向有效实体(因为它不是数组,而是指向单个数据的指针)。有一个基本假设,即指针可以递增到下一个字符。

有了数组,您就知道内存中有多个连续的字符(前提是数组的长度为 2 或更大)。您不知道序列(集合)中是否有终止 nul。您可以假设,但字符数组并不能保证这一点。

用法
通过数组声明,文本的长度在编译时已知。

对于指针声明,您需要使用 strlen 来确定运行时文本的长度。运行时代码不知道目标 数据字符串的长度;只能保证1的长度。

有时候,使用staticconst可以帮助编译器优化。
例如:

static const char moo[] = "moo";

允许编译器直接访问文本,而无需创建数组变量并将文本复制到变量中。

在接收指向字符的指针的函数中,您不能保证指针指向有效位置(指针的内容可能无效)。

每个声明都有其优点和副作用。
选择权在你。

关于c++ - const char[] 和 const char* 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536666/

相关文章:

使用c计算文件中的行数

c++ - QPluginLoader 实例总是返回 null

c++ - Winform 不在设计器中显示

c++ - Cython 不能使用 operator()

PHP:修改多维数组的最干净方法?

ruby - 按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

ruby - 如果还没有的话,是否有 Ruby 习惯用法可以将对象封装在数组中?

c - 偏移指针的正确方法是什么?

c++ - 指向类模板的指针

c++ - 删除后指针本身会发生什么?