C++数组声明时赋值与声明后赋值的编译差异咨询
为啥C++里数组声明时赋值没问题,之后再赋值就报错?
这俩写法看着像,但其实是完全不同的操作——一个是数组初始化,一个是数组赋值,C++对这俩的规则天差地别:
1. 声明时的char c[5] = "Hey!"是初始化,合法!
当你在定义数组的同一行直接给它赋值,这属于初始化操作。编译器会在为数组分配内存的同时,把字符串"Hey!"的每个字符(包括末尾的\0)逐个拷贝到数组的内存空间里。这是C++标准明确允许的语法,相当于给数组“天生”就设定好初始值。
代码示例:
#include <iostream> int main() { char c[5] = "Hey!"; // 完全合法:数组初始化 }
2. 后来的c = "Hey!"是赋值操作,C++不允许!
在C++里,数组名本质上是一个指向数组首元素的常量指针——它的值(也就是数组所在的内存地址)是固定的,不能被修改。当你写c = "Hey!"时,"Hey!"是一个字符串字面量,它存放在内存的只读区域里,你试图把这个区域的地址赋值给数组名c,但c是个常量,不能被重新赋值,所以编译器就会报错expression must be a modifiable lvalue(意思是:你要赋值的东西得是个能被修改的左值,但数组名不是)。
错误代码示例:
#include <iostream> int main() { char c[5]; c = "Hey!"; // 非法:数组不能直接赋值 }
那想给已有的数组赋值该咋整?
如果要给已经创建好的数组更新内容,得用字符串拷贝函数,比如strcpy(记得包含<cstring>头文件):
#include <iostream> #include <cstring> int main() { char c[5]; strcpy(c, "Hey!"); // 合法:把字符串内容拷贝到数组里 }
当然你也可以手动逐个元素赋值,但显然strcpy更省心。
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

