我知道它们是不同的,我知道它们有何不同,并且我阅读了我能找到的有关 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
指针/数组)
最佳答案
两者截然不同,首先:
- 第一个创建一个指针。
- 第二个创建一个数组。
继续阅读以获取更详细的说明:
数组版本:
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/