在 C++ 中,我们可以写
1 char *s="hello"
但是下面的程序行会产生错误(无法将 char* 转换为 char)
2 char *s;
*s="hello";
我在这里很困惑,1和2有什么区别,为什么会出现这个错误?
原文由 vishal rana 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++ 中,我们可以写
1 char *s="hello"
但是下面的程序行会产生错误(无法将 char* 转换为 char)
2 char *s;
*s="hello";
我在这里很困惑,1和2有什么区别,为什么会出现这个错误?
原文由 vishal rana 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++ 中,字符串文字是一个 常量 字符数组,而不仅仅是像 C 中的字符数组。无论如何,要分配给这样的变量(最好避免),您不必取消引用指针。取消引用它会访问第一个元素,它只是一个字符。 char 不能在其中保存字符数组,从而导致错误。这更多是您应该使用 std::string
的原因。
一些编译器(例如 GCC)提供了扩展以使此类代码成为可能,因为它不是符合标准的代码,它看起来像:
char* s = "hello";
s = "new string";
这会在 GCC 中生成以下警告(但仍会得到预期的结果):
警告:ISO C++ 禁止将字符串常量转换为 ‘char*’ [-Wwrite-strings]
Clang 也具有相同输出的相同行为(也会生成警告)
原文由 Arnav Borborah 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答1.3k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答859 阅读
1 回答929 阅读
1 回答965 阅读
1 回答730 阅读
1 回答831 阅读
字符串是一个字符数组。因此,字符串的 开头 是
const char *
。因此要引用一个字符串,你可以使用const char * s = "hello";
但是,如果您取消引用
const char*
,您会得到const char
。这不是一个字符串,即*s
给你’h’。在您的代码
*s="hello";
中,您说的是“在取消引用的 s 处分配值“你好””。取消引用 s 只是一个字符,您试图为其分配一个字符串。