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

为什么向函数传递二维数组时需要使用int a[][10]的形式?

C语言二维数组传参规则解析

首先要澄清一个常见误解:你完全可以把函数形参写为int a[10][10],这个写法本身是合法的,只是第一维的数值10没有任何实际作用,所以行业内约定俗成省略第一维的数值,写为int a[][10]的形式,背后的原理和C语言数组传参的底层规则有关:

1. 数组传参的核心规则

C语言标准明确规定:当数组类型出现在函数形参列表中时,编译器会自动将其调整为「指向该数组首元素的指针」。
举个一维数组的例子:

// 你写的形参是这个
int func(int a[10])
// 编译器实际处理后等价于这个
int func(int *a)

形参里写的数组长度10会被完全忽略,不会做任何参数校验,你传长度为3、长度为20的int数组都可以正常调用。

2. 二维数组的本质

二维数组本质是「元素为数组的数组」。比如int arr[5][10]这个二维数组,它的每个元素都是一个长度为10的int数组,所以它的首元素类型是int[10],指向首元素的指针类型就是int (*)[10](指向长度为10的int数组的指针)。

3. 二维数组形参的处理逻辑

当你把二维数组作为形参时,编译器同样会执行数组转指针的调整:

// 你写的形参是这个
int func(int a[10][10])
// 编译器实际处理后等价于这个
int func(int (*a)[10])

这里只有第一维的10会被忽略,第二维的10是指针类型的一部分,不能省略:

  • 指针运算需要知道指向元素的大小,a[i]等价于*(a + i),偏移字节数为i * sizeof(int[10]),如果不知道第二维的长度,就无法计算偏移量,访问数组元素会出错。
  • 省略第一维写成int a[][10]的写法更符合实际逻辑,能明确告诉读代码的人:这个函数接收的二维数组第二维固定为10,第一维长度不做限制,避免第一维写了10反而误导他人以为只能传第一维长度为10的数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:09