将一个字符数组赋值给字面字符串 - c++

5
char arr[3];
arr="hi";// ERROR
cin>>arr;// and at runtime I type hi, which works fine.

1) 有人能解释一下为什么吗?

2) “hi”到底是什么类型? 我知道它被称为字面字符串。但它只是字符数组吗?

3) cin>>arr;不就像将arr赋值为你在运行时键入的内容吗?

2个回答

6
在C++中,数组不是实际的类型,只是一系列值的结构化表示,并且如果您在任何地方发现它们,它们并不是指针(它们会衰变成指针)。您不能像使用其他类型一样使用它们,包括赋值。选择是要么添加大量数组支持,要么尽可能保持简单和快速。后者被选择了,这是C++与其他一些语言之间的区别之一。
要复制一个数组,请逐个复制每个元素。
在C++11中,有一个STL容器std::array。它被设计为与操作符重载一起作为普通数组相匹配,同时与STL的其余部分相关。
更好的选择是std::string。它包含您想要的行为及更多内容,并专门设计用于保存字符数组。
"hi"是const char [3],如Konrad Rudolph所指出的。
至于cin输入一个原始数组,通过标准手段是不可能的,因为没有为数组提供cin重载。不过,您可以创建自己的重载。但是,我不确定您如何处理传递的不同大小的数组,除非您为知道其大小的容器定义它,而不是原始数组。

一个更好的选择是 std::string - Cornstalks
1
+1 ;) 当你刚接触C或C++时,这是最重要的概念之一。对于数组和指针,千万不要混淆它们 ;) - cli_hlt
@chris 关于cin>>arr这一部分,你能回答相关问题吗? - Alex Dannk
1
"hi" 不是一个 const char*,而是一个 const char[3]。否则你就无法用它来初始化一个数组。 - Konrad Rudolph
2
@Alex 对 char[] 的赋值操作会复制数组,因此没有问题。对 char* 的赋值在技术上是无效的,但是为了向后兼容性(C 允许这样做),C++ 允许这样做。但是现代编译器应该会对这段代码发出警告(至少所有可以配置的编译器都可以这样做),而且据我所知,在 C++11 中完全禁止这样做。 - Konrad Rudolph
显示剩余4条评论

6

如果您愿意,您可以声明:

char array[] = "hi!";

创建一个数组并将其“初始化”为4个字节长,“hi!”
char const *array2 = "hey!";

创建一个指向只读内存的指针,即字符串字面值。
array2 = array;

现在,您可以使用array2指针来访问array one。这称为指针衰减;虽然它们可以在这里合作,但array和array2不是相同类型的数组。类型为char的数组“衰减”为类型为char的指针。

array = array2; // ERROR

数组不是指针。你可能认为数组就像指针一样,但实际上,它是预先分配的。你试图分配一个地址,但当数组[]被创建时,它已经有了一个“硬编码”的地址,并且不能被改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接