我输入时没有错误提示
char a[10] = "Hi";
但是当我把它改成以下内容时,我会得到一个错误:Array type char is not assignable.
char a[10];
a = "Hi";
为什么字符数组类型不可赋值?这是因为语言本身就是有意这样设计的还是我漏掉了某个要点?
我输入时没有错误提示
char a[10] = "Hi";
但是当我把它改成以下内容时,我会得到一个错误:Array type char is not assignable.
char a[10];
a = "Hi";
为什么字符数组类型不可赋值?这是因为语言本身就是有意这样设计的还是我漏掉了某个要点?
数组不是可修改的 lvalue
使用
char a[10];
strcpy(a, "Hi");
如我之前所评论的,C++做这件事情的方式是使用std::string
而不是char[]
。那样会给你期望中的赋值行为。
话虽如此,你仅在第二个例子中得到错误的原因是这两行中的=
有不同的含义:
char a[10] = "Hi";
a = "Hi";
第一个是初始化,第二个是赋值。
第一行在堆栈上分配了足够的空间以容纳10个字符,并将其中的前三个字符初始化为'H'、'i'和'\0'。从这点开始,所有a
做的就是引用堆栈上数组的位置。因为数组只是堆栈上的一个位置,所以a
永远不允许更改。如果你想要在堆栈上的不同位置存储不同的值,你需要另一个变量。
另一方面,第二行(无效)尝试将a
更改为引用(技术上不同的)"Hi"
的咒语。由于上述原因,这是不允许的。一旦你有了一个初始化的数组,你唯一能做的就是从中读取值并向其中写入值。你不能改变它的位置或大小。在这种情况下,赋值会尝试做到这一点。
std::string
来实现 OP 想要的行为吗?我认为这将是一个好答案的有益补充。 - NathanOliver该语言不允许将字符串直接赋值给字符数组。你应该使用strcpy()
代替:
strcpy(a, "Hi");
strcpy
。忘记你曾经听说过 strncpy
可能一点损失都没有 - 它几乎和 gets
一样没用。 - Jerry Coffina是指向数组的指针,而不是数组本身。它无法被重新分配。
顺便提一下,你标记了C++。对于这种情况最好使用std::string。这可能更符合你的期望。
a
是数组本身,而不是指向数组的指针。它可以被隐式转换为指向第一个元素的指针。 - Joseph Mansfieldchar a[10] = "Hi";
这是一个小的“额外功能”,因为它不能在运行时完成。
但这就是C/C++标准库存在的原因。
#include <string.h>
// ...
strcpy(a,"Test"); // STR-ing C-o-PY.
这来自于C标准库。如果使用C++,你应该使用std::string,除非你真的想从目标计算机中获得所有可能的性能。
这是因为初始化不是赋值。第一件有效的事情是初始化,而第二件预期中不起作用的事情是赋值。你不能简单地将值分配给数组,你应该使用类似于 strcpy
或 memcpy
的东西。或者你可以选择使用来自 <algorithm>
的 std::copy
。
这很简单,(=) 有两种不同的含义:赋值和初始化。你也可以像这样编写你的代码
#include <iostream>
using namespace std;
int main ()
{
char message[3] = {'H', 'i', '\0'};
cout << message<< endl;
return 0;
}
在这段代码中,你不需要编写复杂的代码或函数,甚至不需要使用string.h库。