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

rve*_*rve 43 c c++

我知道他们是不同的,我知道他们是如何不同的,我读了所有关于char*vs的问题char[]

但所有这些答案都没有告诉他们何时应该使用它们.

所以我的问题是:

你什么时候用的

const char *text = "text";
Run Code Online (Sandbox Code Playgroud)

你什么时候用的

const char text[] = "text";
Run Code Online (Sandbox Code Playgroud)

有没有指导方针或规则?

举个例子,哪一个更好:

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

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

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

Alo*_*ave 45

两者都截然不同,首先:

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

继续阅读以获得更详细的解释:

阵列版本:

char text[] = "text"; 
Run Code Online (Sandbox Code Playgroud)

创建一个足以容纳字符串文字"text"的数组,包括其NULL终结符.text使用字符串文字"text"初始化数组.可以在以后修改该阵列.此外,即使在编译时也可以知道数组的大小,因此sizeof可以使用运算符来确定其大小.


指针版本:

char *text  = "text"; 
Run Code Online (Sandbox Code Playgroud)

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

事实上,C++ 03不赞成使用不带const关键字的字符串文字.声明应该是:

const char*text = "text";
Run Code Online (Sandbox Code Playgroud)

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


哪个版本更好?

取决于用法.

  • 如果您不需要对字符串进行任何更改,请使用指针版本.
  • 如果要更改数据,请使用阵列版本.

编辑:我刚刚注意到(在评论中)OP寻求以下区别:

const char text[]const char* text

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

鉴于此,我会在指针版本上选择数组版本,因为指针可以(错误地)轻易地重新设置为另一个指针,并且可以通过另一个指针修改字符串,从而产生UB.

  • 我想补充一点,除非它是“char *const”或“char const *const”,否则指针可以重置为指向不同的缓冲区,因此在限制意义上“text”可以更改。 (2认同)

Jas*_*son 8

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

例如,做:

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

void withArray()
{
    const char sz[] = "hello";
    std::cout << sizeof(sz) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

会给你非常不同的答案.

  • 我想借此机会指出sizeof不是函数. (7认同)
  • @unwind:从技术上讲,但在解析`std :: cout << sizeof sz << std :: endl;`时,我的眼睛会感到困惑,因为一行中的两个标识符通常表示一个类型声明.`sizeof(sz)`我的大脑解析为另一个函数. (2认同)

ten*_*our 6

一般来说,要回答这些类型的问题,请使用最明确的问题.

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