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

C语言中为何传值传递数组却呈现传引用传递的效果?

C语言二维数组作为函数参数的修改机制解析

你困惑的核心原因是C语言中数组作为函数参数时会自动退化为指针,并非按值传递整个数组,所以函数内的修改会直接作用于原数组内存。

具体细节拆解

  1. 参数声明的语法糖
    你写的函数参数float matrix4f[4][4],看起来像是接收一个二维数组,但编译器会自动将其解析为float (*matrix4f)[4]——也就是指向一个包含4个float元素的一维数组的指针。这是C语言的语法规则,多维数组作为参数时,除了最外层维度可以省略,内层维度必须明确,本质还是传递指针。

  2. 数组传递的本质
    当你调用calypso_framework_math_matrix_matrix4f_ortho(game_camera_projection_matrix, ...)时,传递的不是整个game_camera_projection_matrix数组的副本,而是这个数组首元素的地址(即第一行数组的地址)。函数内通过matrix4f[i][j]访问元素,实际上是通过指针间接访问原数组的内存空间,所以修改操作会直接覆盖原数组的内容。

  3. 和C的对比
    你有C
    基础,需要注意:C++中原生数组作为函数参数的行为和C完全一致,同样会退化为指针。如果是使用std::array<std::array<float,4>,4>这类容器,按值传递时才会复制副本,函数内修改不影响原容器;但原生数组的传递逻辑和C语言没有区别。

验证方式

如果想确认这一点,可以在函数内打印sizeof(matrix4f),你会发现结果是指针的大小(比如64位系统是8字节),而不是整个二维数组的大小(444=64字节),这就证明参数已经退化为指针,而非数组本身。

内容的提问来源于stack exchange,提问作者wayfarerGameDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:25:18