字符串声明

String Declaration

本文关键字:声明 字符串      更新时间:2023-10-16
当我

通过以下方式声明时,字符串声明起作用:

string a = "xyz";
char a[] = "xyz";

但在以下情况下:

char *a = "xyz";

它在 g++ 4.9.2 编译器中给出了一个错误:

警告:已弃用从字符串常量到"char*"的转换 [-Wwrite-strings] char *a = "xyz";

我认为这三种声明类型彼此不同。请帮帮我。

string a = "xyz";

这使用初始值设定项语法来调用构造函数std::string( const char* )

char a[] = "xyz";

这声明了一个足够大的数组来存储字符串和终止符。 它遵循标准的数组初始值设定项规则。 把它想象成等同于char a[] = { 'x', 'y', 'z', '' };

char *a = "xyz";

这需要一个字符串文字("xyz")并将其分配给一个非常量指针。 在语言中,这样的指针意味着可以修改它指向的字符串,但在这种情况下这是未定义的行为,因为字符串文字可能无法修改。 为了防止您犯此类错误,编译器会向您发出警告。 以下内容有效,不会发出警告:

const char *a = "xyz";

在该语言的早期版本中,您可以使用:

char* a = "xyz";

现在,您必须使用:

char const* a = "xyz";

字符串文本(如 "xyz")驻留在程序的仅 rea 部分中。它可用于初始化char const*因为您不应该修改char const*指向的内容。使用它来初始化char*打开了用户意外修改它们的可能性。此外,修改此类字符串会导致未定义的行为。

字符串文本也可用于初始化char[]。在这种情况下,字符串文本将复制到为数组分配的空间中。因此,没有修改程序只读数据的风险。因此,使用

char a[] = "xyz";

没关系。

该行

string a = "xyz";

调用采用char const*string 的构造函数,然后使用该对象初始化a。因此,这条线也可以。