何时使用const char *以及何时使用const char []

时间:2011-10-26 13:48:04

标签: c++ c

我知道他们是不同的,我知道他们是如何不同的,我读了所有关于char* vs 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指针/数组)

6 个答案:

答案 0 :(得分:42)

两者截然不同,首先:

  1. First创建一个指针。
  2. 第二个创建一个数组。
  3. 继续阅读以获取更详细的解释:

    阵列版本:

    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。

答案 1 :(得分:8)

可能最大的区别在于你不能使用sizeof运算符和指针来获取指向的缓冲区大小,其中 - 与const char[]版本一样,你可以使用{{1在数组变量上获取数组的内存占用大小(以字节为单位)。所以它实际上取决于你想要用指针或缓冲区做什么,以及你想如何使用它。

例如,做:

sizeof

会给你非常不同的答案。

答案 2 :(得分:6)

一般来说,为了回答这些类型的问题,使用最明确的

在这种情况下,const char[]获胜,因为它包含有关数据的更详细信息 - 即缓冲区的大小。

答案 3 :(得分:4)

请注意:

我会成功static const char sz[] = "hello";。这样声明具有很好的优点,即通过写入只读内存来更改该常量字符串会使程序崩溃。如果没有static,则抛弃常量然后更改内容可能会被忽视。

此外,static允许数组简单地位于常量数据部分,而不是在堆栈上创建,并在每次调用函数时从常量数据部分复制。 / p>

答案 4 :(得分:2)

如果使用数组,则在运行时初始化数据。如果使用指针,则运行时开销(可能)较少,因为只需要初始化指针。 (如果数据小于指针的大小,则数据的运行时初始化小于指针的初始化。)因此,如果您有足够的数据,那么重要且您关心运行时初始化的成本,你应该使用指针。你几乎不应该关心这些细节。

答案 5 :(得分:1)

几年前,Ulrich Drepper的博客文章为我提供了很多帮助:

so close but no cigarmore array fun

博客的要点是const char[]应该是首选,但仅作为全局变量或静态变量。

使用指针const char*有缺点:

  1. 附加变量
  2. 指针是可写的
  3. 额外的间接
  4. 通过指针访问字符串需要2个内存加载