为什么它不能将char *转换为char

时间:2018-02-08 15:57:02

标签: c++

在c ++中我们可以写
1 char *s="hello"

但是下面的程序行会产生错误(无法将char *转换为char) 2 char *s; *s="hello";

我在这里很困惑,1和2之间有什么区别 为什么会出现这个错误?

4 个答案:

答案 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可能看起来与你相似,但它们意味着非常不同的东西,因此错误。