我知道他们是不同的,我知道他们是如何不同的,我读了所有关于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
两者都截然不同,首先:
继续阅读以获得更详细的解释:
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.
可能最大的区别在于你不能使用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)
会给你非常不同的答案.