我知道它们是不同的,我知道它们有何不同,并且我阅读了所有我能找到的关于 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
指针/数组)
原文由 rve 发布,翻译遵循 CC BY-SA 4.0 许可协议
两者明显不同,首先:
继续阅读以获得更详细的解释:
数组版本:
创建一个足够大的数组来保存字符串文字“text”,包括它的
NULL
终止符。数组text
用字符串文字“text”初始化。 该数组可以在以后修改。此外,即使在编译时数组的大小也是已知的,因此 可以使用sizeof
运算符来确定其大小。指针版本:
创建一个指向字符串文字“text”的指针。这比数组版本快, 但指针指向的字符串不应更改,因为它位于只读实现定义的内存中。修改这样的字符串文字会导致 Undefined Behavior 。
事实上,C++03 不赞成使用没有
const
关键字的字符串文字。所以声明应该是:此外,您 需要使用
strlen()
函数,而不是sizeof
来查找字符串的大小, 因为sizeof
运算符只会给您指针的大小多变的。哪个版本更好?
取决于使用情况。
编辑:我刚刚注意到(在评论中)OP寻求以下区别:
const char text[]
和const char* text
好吧,除了关于修改字符串文字的那一点之外,上述不同点仍然适用。使用
const
限定符,数组test
现在是一个包含const char
类型元素的数组,这意味着它们不能被修改。鉴于此,我会选择数组版本而不是指针版本,因为指针可以(错误地)轻松地重新定位到另一个指针,并且可以通过另一个指针修改字符串,从而导致 UB。