c++ - 何时使用 const char * 何时使用 const char[]

标签 c++ c

我知道它们是不同的,我知道它们有何不同,并且我阅读了我能找到的有关 char*char[] 的所有问题

但是所有这些答案都没有告诉我们什么时候应该使用它们。

所以我的问题是:

什么时候使用

const char *text = "text";

你什么时候使用

const char text[] = "text";

有什么指导方针或规则吗?

举个例子,哪个更好:

void withPointer()
{
    const char *sz = "hello";
    std::cout << sz << std::endl;
}

void withArray()
{
    const char sz[] = "hello";
    std::cout << sz << std::endl;
}

(我知道 std::string 也是一个选项,但我特别想了解 char 指针/数组)

最佳答案

两者截然不同,首先:

  1. 第一个创建一个指针。
  2. 第二个创建一个数组。

继续阅读以获取更详细的说明:

数组版本:

char text[] = "text"; 

创建一个足够大的数组来容纳字符串文字“text”,包括其 NULL 终止符。数组text 使用字符串文字“text”进行初始化。该数组稍后可以修改。此外,即使在编译时,数组的大小也是已知的,因此可以使用 sizeof 运算符来确定其大小。

<小时/>

指针版本:

char *text  = "text"; 

创建一个指向字符串文字“text”的指针。这比数组版本更快,但是指针指向的字符串不应更改,因为它位于只读实现定义的内存中。修改此类字符串文字会导致未定义的行为

事实上,C++03 不推荐使用不带 const 关键字的字符串文字。所以声明应该是:

const char*text = "text";

此外,您需要使用 strlen() 函数,而不是 sizeof 来查找字符串的大小,因为 sizeof 运算符只会给出指针变量的大小。

<小时/>

哪个版本更好?

取决于用途。

  • 如果不需要对字符串进行任何更改,请使用指针版本。
  • 如果您打算更改数据,请使用数组版本。
<小时/>

编辑:我刚刚注意到(在评论中)OP寻求以下之间的差异:

const char text[]const char* text

好吧,除了有关修改字符串文字的那一点之外,上述不同点仍然适用。使用 const 限定符,数组 test 现在是一个包含 const char 类型元素的数组,这意味着它们无法修改。

鉴于此,我会选择数组版本而不是指针版本,因为指针可以(错误地)轻松地重新定位到另一个指针,并且可以通过另一个指针修改字符串,从而产生 UB。

关于c++ - 何时使用 const char * 何时使用 const char[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23843673/

相关文章:

c - 编写 C 主函数

c++ - VS 2010,C++中使用 "open"时文件的默认保存路径

c++ - 禁用特定宏的 clang-tidy 警告

c++ - 奇怪的 visual studio 2008 C++ 编译器错误

c++ - 我可以 memcpy() 任何具有普通析构函数的类型吗?

c - 链表中的字符串输入 [C]

C 从文件加载文本,打印转义字符

c++ - 技巧 : filling array values using macros (code generation)

c# - 如何在 c# (mono) 中导入 c 库 (.dll/.so)

c++ - 从参数包到可变参数