在c ++中我们可以写
1 char *s="hello"
但是下面的程序行会产生错误(无法将char *转换为char)
2 char *s;
*s="hello";
我在这里很困惑,1和2之间有什么区别 为什么会出现这个错误?
答案 0 :(得分:6)
在C ++中,字符串文字是一个常量字符数组,而不仅仅是C中的字符数组。无论如何,要分配给这样一个变量(最好避免),你可以不必取消引用指针。解除引用它会访问第一个元素,它只是一个char。 char不能在其中包含一个字符数组,从而导致错误。这就是您应该使用std::string
的原因。
某些编译器(如GCC)提供扩展以使这些代码成为可能,因为它不符合标准的代码,它看起来像:
char* s = "hello";
s = "new string";
这会在GCC中生成以下警告(但仍会获得预期结果):
警告:ISO C ++禁止将字符串常量转换为'char *'[-Wwrite-strings]
Clang也具有相同的输出(同时生成警告)
答案 1 :(得分:2)
字符串是一个字符数组。因此,字符串的开始为const char *
。
因此,要引用字符串,您可以使用const char * s = "hello";
但是,如果您取消引用const char*
,则会获得const char
。这不是一个字符串,*s
给你'h'。
在你的代码*s="hello";
中,你说“在dereferened s中分配值”hello“”。取消引用s只是一个字符,您尝试为其分配字符串。
答案 2 :(得分:2)
问题是第二个例子中的第二个星号。
第一个代码就是这个
char *s="hello";
等效代码是
char *s;
s="hello";
第二行*
之前没有s
。
现在每个人都指出这些都不是合法的C ++。正确的代码是
const char *s="hello";
或
const char *s;
s="hello";
因为字符串文字是常量,所以你需要一个指向const char
的指针。
答案 3 :(得分:0)
我在这里很困惑,1和2之间有什么区别,为什么会出现这个错误?
C ++中的许多其他*
在不同的上下文中意味着不同的东西:
char *s; // * here means that s type is a pointer to char, not just char
*s; // in this context * means dereference s, result of exression is char
int a = 5 * 2; // in this context * means multiply
所以情况1和2可能看起来与你相似,但它们意味着非常不同的东西,因此错误。