You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:10:28