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

二维数组传递给函数时,第二个下标有何作用?

二维数组传递给函数时,第二个下标有何作用?

咱们先搞清楚C语言里二维数组传参的本质:二维数组其实是「数组的数组」,比如int arr[3][5],本质是一个包含3个元素的数组,每个元素又是一个包含5个int的一维数组。当你把它传给函数时,它会退化成一个指向一维数组的指针(也就是int (*arr)[5]这种类型),可不是二维指针哦。

那第二个下标(也就是列数)的核心作用,就是帮编译器计算内存地址的偏移量:

  • 当你在函数里写arr[i][j]时,编译器需要知道每一行有多少个元素,才能算出从指针起始位置,跳过多少个字节才能定位到第i行第j列的元素。
  • 如果不指定第二个下标,编译器根本摸不清每个行数组的长度,也就没法正确解析arr[i][j]对应的内存位置,直接就会编译报错。

正如《C程序设计语言》里提到的:

数组仅第一维度(下标)可自由指定;第二维度下标必须指定:若要将二维数组传递给函数,函数中的参数声明必须包含列数;行数无关紧要,因为传递的是指向行数组的指针,其中每行是一个包含5个int的数组。

举个实际的例子,正确的函数声明可以是这样的:

// 两种写法等价,都明确指定了列数为5
void print_arr(int arr[][5], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

// 或者用指针形式声明
void print_arr(int (*arr)[5], int rows) {
    // 逻辑和上面完全一致
}

这里的行数rows只是用来控制循环范围,编译器并不依赖它来计算内存偏移,所以可以随便传;但列数5必须在参数里明确写死,不然编译器就“搞不懂”数组的内存布局了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:09:32