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

二维整数数组参数选型:int (*array)[cols]、(*array)[]还是**array?

可变行固定列二维数组传参的三种写法解析

1. void function(int (*array)[cols]):类型安全,但内存连续得自己控制

首先明确:编译器不会帮你分配内存,内存分配全靠你自己用malloc操作:

  • 如果要让整个二维数组处于连续内存中,你得一次性申请rows * cols * sizeof(int)大小的空间,再强制转换成int (*)[cols]类型,这样array[i][j]就能直接按连续内存的偏移逻辑访问。
  • 如果是每行单独调用malloc,那每行就是独立的内存块,整个数组的内存是碎片化的,并非连续。
    这种写法的核心优势是编译器明确知道列数cols,用array[i][j]访问元素时,能直接算出正确的内存地址,同时类型安全——比如你传了列数不匹配的数组,编译器会直接报错。

2. void function(int (*array)[]):几乎没用的写法

这种不指定列数的数组指针属于不完整类型,C标准不允许这么定义函数参数。因为编译器不知道每行包含多少元素,根本无法计算array[i][j]的内存偏移,编译大概率会报错;就算某些编译器有扩展支持,实际使用也极易出问题,完全不推荐。

3. void function(int **array):灵活但有明显局限

双指针本质是一个指针数组,每个元素指向一行的内存:

  • 你可以每行单独分配内存,也可以把一块连续内存拆分成每行的指针挂上去。
    但它的问题也很突出:
    • 访问array[i][j]时,得先读取array[i]拿到行指针,再读取对应位置的元素,比数组指针多一次内存寻址操作。
    • 类型和原生二维数组不兼容——比如你在栈上定义int arr[5][3];,直接传给int **类型的参数会报错,必须手动转换或者额外做一个指针数组来适配。

功能与效率对比

功能层面

  • int (*array)[cols]:最适配固定列数的场景,类型安全,支持原生二维数组语法,不管内存是连续还是碎片化都能正常使用,唯一需要注意的是连续内存得自己一次性分配。
  • int (*array)[]:实用性为0,直接忽略即可。
  • int **array:灵活性最高,行和列都能动态修改,但类型不安全,和原生二维数组适配麻烦,还得额外维护行指针数组。

效率层面

  • int (*array)[cols] 效率最高:array[i][j]的地址是编译期就能计算完成的,直接一次内存访问就能拿到元素。
  • int **array 稍慢:需要两次内存访问(先拿行指针,再拿元素),如果数组规模较大,这个性能差异会更明显。
  • int (*array)[]:连编译都大概率无法通过,更谈不上效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:51:34