【问题标题】:assign a char array to a literal string - c++将 char 数组分配给文字字符串 - C++
【发布时间】:2012-05-03 02:06:07
【问题描述】:
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++ arrays string char


    【解决方案1】:

    C++ 中的数组不是实际类型,只是一系列值的结构化表示,如果你可以在任何地方找到指针(它们衰减为指针),它也不是指针。你不能像使用其他类型一样使用它们,包括赋值。选择是增加对数组的大量支持,或者使它们尽可能简单和快速。选择了后者,这是 C++ 与其他一些语言的区别之一。

    要复制一个数组,一次复制一个元素。

    在 C++11 中,有一个 STL 容器std::array。它被设计为适合作为具有运算符重载的普通数组,以及与 STL 的其余部分相关。

    更好的选择是std::string。它结合了您想要的行为以及更多,并且专为保存字符数组而设计。

    正如 Konrad Rudolph 所指出的,“hi”是const char [3]

    至于cin 使用原始数组,通过标准方法是不可能的,因为没有为cin 提供数组的重载。不过,可以创建自己的重载。但是,我不确定您将如何解释传递的数组的不同大小,除非您为知道其大小而不是原始数组的容器定义它。

    【讨论】:

    • 一个更好的选择是std::string
    • 糟糕,忘了这是一个字符数组^_^
    • +1 ;) 这是 C 或 C++ 新手要掌握的最重要概念之一。是的,永远不要将数组与指针混淆;)
    • "hi" 不是 const char*。这是const char[3]。否则你不能用它初始化一个数组。
    • @Alex 赋值给char[] 复制数组所以没有问题。分配给 char* 在技术上是无效的,但 C++ 出于向后兼容性的原因允许它(C 允许它)。但是每个现代编译器都应该针对这段代码发出警告(至少所有编译器都可以配置为这样做),据我所知,它在 C++11 中是完全禁止的。
    【解决方案2】:

    如果您愿意,可以声明:

    char array[] = "hi!";
    

    创建一个数组并将其“初始化”为 4 个字节长,“嗨!”

    char const *array2 = "hey!";
    

    创建一个指向只读内存的指针,一个字符串字面量

    array2 = array;
    

    您现在可以使用 array2 指针访问数组 1。这称为指针衰减; array 和 array2 不是同一类型,即使它们在这里可以合作。 char 类型的 array “衰减”为 char 类型的 pointer-to

    array = array2; // ERROR
    

    数组不是指针。您认为数组是指针,实际上,它是预先分配的。您正在尝试分配一个地址,但 array[] 在创建时已经有一个“硬编码”,并且无法更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2015-04-25
      • 2014-06-08
      相关资源
      最近更新 更多