char arr[3];
arr="hi";// ERROR
cin>>arr;// and at runtime I type hi, which works fine.
1)有人可以向我解释为什么吗?
2)究竟什么是“hi”的类型,我知道它被称为文字字符串。但它也只是一个字符数组吗?
3) 不是 cin>>arr;就像将 arr 分配给您在运行时键入的内容一样?
C++ 中的数组不是实际类型,只是一系列值的结构化表示,如果您应该在任何地方找到它(它们衰减为指针),它也不是指针。你不能像使用其他类型一样使用它们,包括赋值。选择是增加对数组的大量支持,或者使它们尽可能简单和快速。选择了后者,这是 C++ 与其他一些语言的区别之一。
要复制数组,请一次复制每个元素。
在 C++11 中,有一个 STL 容器std::array
。它被设计为适合作为具有运算符重载的普通数组,以及与 STL 的其余部分相关联。
更好的选择是std::string
. 它包含了您想要的行为以及更多,并且专为保存字符数组而设计。
正如 Konrad Rudolph 指出的那样,“hi”是一个const char [3]
.
至于cin
原始数组,通过标准方法是不可能的,因为cin
数组没有提供重载。不过,可以创建自己的重载。但是,我不确定您将如何解释传递的数组的不同大小,除非您为知道其大小而不是原始数组的容器定义它。
如果你愿意,你可以声明:
char array[] = "hi!";
创建一个数组并将其“初始化”为 4 个字节长,“嗨!”
char const *array2 = "hey!";
创建一个指向只读内存的指针,一个字符串字面量
array2 = array;
您现在可以使用 array2 指针访问数组 1。这称为指针衰减;array 和 array2 不是同一类型,即使它们在这里可以合作。char 类型的数组“衰减”为 char 类型的指针。
array = array2; // ERROR
数组不是指针。您认为数组是指针,实际上,它是预先分配的。您正在尝试分配一个地址,但 array[] 在创建时已经有一个“硬编码”,并且无法更改。