我知道它们是不同的,我知道它们有何不同,并且我阅读了我能找到的所有关于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;
}
(I know 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[]
and const char* text
好吧,除了有关修改字符串文字的那一点之外,上述不同点仍然适用。随着const
限定数组test
现在是一个包含类型元素的数组const char
这意味着它们不能被修改。
鉴于此,我会选择数组版本而不是指针版本,因为指针可以(错误地)轻松地重新定位到另一个指针,并且可以通过另一个指针修改字符串,从而产生 UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)