C++中二维数组赋值报错‘expression is not assignable’求助
问题分析与解决
错误原因
你写的((*field)[x] + y) = value;之所以报错,核心是这个表达式的结果是右值,无法被赋值:
*field是指向二维数组第一行的指针,(*field)[x]等价于field[x],本质是第x行数组的首地址(int*类型指针)。- 对这个指针做
+ y运算后,得到的是第x行第y个元素的地址数值(临时值),而不是元素本身的可修改内存引用。C++规定只有能定位到内存位置的左值才能被赋值,临时数值属于右值,不允许被赋值,因此编译器抛出"expression is not assignable"错误。
解决方法
要修改二维数组的第x行第y列元素,有两种简洁正确的写法:
写法1:直接用数组下标(最直观推荐)
field[x][y] = value;
编译器会自动处理数组指针的解引用逻辑:field[x]会自动解引用得到第x行的数组,[y]直接定位到该行第y个元素,这个元素是可修改的左值,直接赋值即可。
写法2:显式指针解引用(理解底层逻辑用)
(*(*field + x) + y) = value; // 或者等价的更易读版本 (*field)[x][y] = value;
*field + x定位到第x行的首地址,*( *field + x )拿到第x行的数组,+ y指向该行第y个元素,最后*解引用得到元素本身,即可完成赋值。
另外,如果想让函数更通用,可把参数改成和main.cpp一致的int (*field)[size](需保证size是全局常量或模板参数),避免硬编码3,后续修改数组大小时无需同步改函数参数。
内容的提问来源于stack exchange,提问作者Ralph B.
相关产品推荐
相关产品推荐

