19

我输入时没有错误

char a[10] = "Hi";

但是当我将其更改为以下内容时,出现错误:Array type char is not assignable.

char a[10];
a = "Hi";

为什么数组类型 char 不可赋值?是因为语言是故意这样写的,还是我漏掉了一点?

4

7 回答 7

25

数组不是可修改的左值

采用

char a[10];
strcpy(a, "Hi");
于 2013-02-16T22:47:11.450 回答
15

正如我在上面评论的那样,执行此操作的 C++ 方法是使用std::string而不是char[]. 这将为您提供您期望的分配行为。

也就是说,您只在第二种情况下收到错误的原因是=这两行中的 the 表示不同的东西:

char a[10] = "Hi";
a = "Hi";

第一个是初始化,第二个是赋值。

第一行在堆栈上分配了足够的空间来容纳 10 个字符,并将前三个字符初始化为“H”、“i”和“\0”。从这一点开始,a所做的就是引用数组在堆栈上的位置。因为数组只是栈上的一个地方,a是永远不允许改变的。如果您希望堆栈上的不同位置保存不同的值,则需要不同的变量。

另一方面,第二行(无效)试图更改a为引用(技术上不同的)咒语"Hi"。由于上述原因,这是不允许的。一旦你有一个初始化的数组,你唯一能做的就是从它读取值并将值写入它。您无法更改其位置或大小。这就是在这种情况下分配尝试做的事情。

于 2013-02-16T23:15:17.907 回答
12

该语言不允许将字符串文字分配给字符数组。您应该strcpy()改用:

strcpy(a, "Hi");
于 2013-02-16T22:46:55.600 回答
2

a 是指向数组的指针,而不是数组本身。它不能被重新分配。

你用 C++ BTW 标记。对于这种情况,最好使用 std::string。这可能是您所期望的更多。

于 2013-02-16T22:46:30.097 回答
1

很简单,

char a[10] = "Hi";

是一个小“额外功能”,因为它不能像在运行时那样完成。

但这就是 C/C++ 标准库的原因。

#include <string.h>

// ...
strcpy(a,"Test"); // STR-ing C-o-PY.

这来自 C 的标准库。如果使用 C++,您应该使用 std::string,除非您真的想从目标 PC 中吸取所有可能的性能。

于 2013-02-16T22:48:08.143 回答
0

这是因为初始化不是赋值。第一个起作用的是初始化,第二个不起作用,正如预期的那样,是赋值。您根本无法将值分配给您应该使用的数组,例如strcpyor memcpy。或者您也可以使用std::copyfrom<algorithm>

于 2013-02-16T22:48:26.553 回答
-2

就是这么简单,(=) 有两种不同的均值赋值和初始化。你也可以这样写你的代码

         #include <iostream>

         using namespace std;

          int main ()
         {
             char message[3] = {'H', 'i', '\0'};

                cout << message<< endl;

           return 0;

           } 

在这段代码中,您无需编写困难的代码或函数,甚至不需要 string.h

于 2013-02-17T08:23:35.527 回答