C语言中为何传值传递数组却呈现传引用传递的效果?
你困惑的核心原因是C语言中数组作为函数参数时会自动退化为指针,并非按值传递整个数组,所以函数内的修改会直接作用于原数组内存。
具体细节拆解
参数声明的语法糖
你写的函数参数float matrix4f[4][4],看起来像是接收一个二维数组,但编译器会自动将其解析为float (*matrix4f)[4]——也就是指向一个包含4个float元素的一维数组的指针。这是C语言的语法规则,多维数组作为参数时,除了最外层维度可以省略,内层维度必须明确,本质还是传递指针。数组传递的本质
当你调用calypso_framework_math_matrix_matrix4f_ortho(game_camera_projection_matrix, ...)时,传递的不是整个game_camera_projection_matrix数组的副本,而是这个数组首元素的地址(即第一行数组的地址)。函数内通过matrix4f[i][j]访问元素,实际上是通过指针间接访问原数组的内存空间,所以修改操作会直接覆盖原数组的内容。和C的对比
你有C基础,需要注意:C++中原生数组作为函数参数的行为和C完全一致,同样会退化为指针。如果是使用std::array<std::array<float,4>,4>这类容器,按值传递时才会复制副本,函数内修改不影响原容器;但原生数组的传递逻辑和C语言没有区别。
验证方式
如果想确认这一点,可以在函数内打印sizeof(matrix4f),你会发现结果是指针的大小(比如64位系统是8字节),而不是整个二维数组的大小(444=64字节),这就证明参数已经退化为指针,而非数组本身。
内容的提问来源于stack exchange,提问作者wayfarerGameDev

