不能。C++中char数组不可用=赋值,因数组名非左值、不支持拷贝语义;须用strcpy、memcpy或循环逐元素复制。

不能。 C++ 中 char 数组(即内置数组类型)不能用等号 = 直接赋值,编译器会报错 error: assignment to expression with array type 或类似提示。
为什么 char 数组不能写 a = b
因为 C++ 标准规定:**数组名不是左值(lvalue)**,它不可修改、不可赋值。数组在大多数上下文中会“退化”为指针(char*),但这个指针是右值或常量地址,不能作为赋值目标。
常见错误现象:
-
char a[10] = "hello"; char b[10]; b = a;→ 编译失败 -
b++或b = &x同样非法,原因一致:数组名不是可寻址的变量
本质限制来自语言设计:数组类型不支持拷贝语义,赋值操作符 = 只对标量(如 int、double)和聚合类型(如结构体、类)定义,而裸数组不属于这两类。
立即学习“C++免费学习笔记(深入)”;
那怎么安全复制字符数组内容
必须显式逐字节/逐元素复制,不能靠 =。常用方式有:
- 用
std::strcpy(需包含<cstring>):std::strcpy(b, a);—— 要求a以'\0'结尾,且b足够大 - 用
std::memcpy(更通用):std::memcpy(b, a, sizeof(a));—— 不依赖结束符,但需确保长度准确 - 用循环手动赋值:
for (int i = 0; i - 改用
std::array<char, 10>或std::string:它们重载了=,支持直接赋值
注意:sizeof(a) 在定义作用域内有效;一旦传入函数,sizeof(a) 就变成指针大小(通常是 8),不能再用于计算数组长度。
为什么结构体里的 char 数组却可以赋值
因为结构体是合法的赋值目标类型。只要结构体中只含可赋值成员(包括数组),整个结构体就支持按位拷贝(bitwise copy)。
示例:
struct S { char data[10]; };
S a = {"hello"}, b;
b = a; // ✅ 合法:这是结构体赋值,编译器生成 memcpy 级别代码
这并非“数组能赋值”,而是“结构体能赋值”,其内部数组被一并复制。你无法绕过规则去直接操作裸数组,但可以通过封装获得等效效果。
真正容易被忽略的是:**数组退化行为与左值约束交织在一起,导致很多看似对称的操作(如 a = b 和 b = a)在裸数组上全部失效,而初学者常误以为只是“语法不支持”,其实它是语言层面的不可变性设计。**


















