了解
"abc"
分配一些静态存储空间,其持续整个程序生命周期。您无法写入该存储空间,因此C++将其类型设置为char const[N]
(N个常量字符的数组)。现在,以下内容使指针指向该存储空间。
char *first = "hi";
由于这种方式会丢失const
,因此指针初始化的这种方式已经被废弃。它之所以能够正常工作,只是为了保持与C语言的向后兼容性,因为在C语言中,字符串文本没有const类型(但仍然是只读的)。因此建议改用以下方式进行初始化。
char const *first = "hi";
相比之下,你展示的最后一种方式将字符串字面值的内容复制到一个数组中,这个数组可以进行写入操作,并且大小正好能够容纳字符串字面值。
char third[] = "new";
如果您在一个函数中这样做,那么和所有变量一样,当您离开其作用域时,该数组将被清除。现在,您展示的第一种方法是不同的。它动态创建了一个字符。您可以像这样初始化它:
char *c = new char('A');
而且由于这是动态发生的,您需要明确告诉编译器何时应该释放内存
delete c;
但是您无法使用字符串字面量初始化字符。您可能想到的是动态创建存储空间,并使用字符串字面量进行初始化。使用new
是不可能的。动态数组的唯一初始化形式是将其清零,但您无法使用字符串字面量或另一个数组的内容直接初始化。对于这种使用new
的方式,很少有必要直接这样做。如果您想要,可以通过创建正确大小的动态数组,然后将字节从字符串字面量复制到该缓冲区来执行此操作。
char *c = new char[sizeof "hello"]; // sizeof "hello" will give 6
std::strcpy(c, "hello");
delete[] c; // delete[] is for deleting dynamic arrays
记住这是相当底层的操作,我建议您使用字符串。
std::string s = "hello"; // s.size() gives you its size
它完全为您管理内存。拼接、索引等功能也是可用的。