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

C语言函数未传递行数参数时,能否使用二维数组?相关疑问

问题解答

1. 必须显式传递行数N作为参数

是的,你必须把N传给函数。因为函数参数里的int (*myarray)[M]本质是一个指向长度为M的int数组的指针,它只知道自己指向的一维数组有多少元素(M个),但完全不知道原二维数组的总行数。没有N的话,函数没法确定遍历的终止条件,所以必须把N作为额外参数传入,修改后的函数原型应该是:

int function(int N, int (*myarray)[M], double y) {}

2. 为什么用sizeof获取行数失败

在main函数里,int myarray[N][M]是一个真正的二维数组实体,此时sizeof(myarray)返回整个二维数组的总字节数(N*M*sizeof(int)),用这个值除以sizeof(myarray[0])(一行的字节数,M*sizeof(int)),就能算出总行数N。

但到了函数内部,情况完全不同:虽然参数写的是int (*myarray)[M],但它已经不是数组了,而是一个指针。此时sizeof(myarray)返回的是指针本身的大小(比如64位系统是8字节),再除以sizeof(myarray[0])得到的结果和N毫无关系,自然没法正确获取行数。

3. 函数内的myarray和main中myarray的核心区别

  • main里的int myarray[N][M]:是二维数组对象,占用一块连续的内存空间,类型为int [N][M],编译器清楚它的完整维度(N行M列),所以能通过sizeof计算总行数、总大小。
  • 函数内的int (*myarray)[M]:是指向一维数组的指针,仅存储一个内存地址,类型为int (*)[M],它只知道自己指向的数组有M个元素,但完全丢失了原二维数组的行数信息。简单说就是,数组作为参数传递时会“退化”成指针,丢掉了行数维度的信息。

举个遍历的示例代码:

#include <stdio.h>

#define M 3

int function(int N, int (*myarray)[M], double y) {
    // 遍历整个二维数组
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("%d ", myarray[i][j]);
        }
        printf("\n");
    }
    return 0;
}

int main() {
    int N = 2;
    int myarray[2][3] = {{1,2,3}, {4,5,6}};
    function(N, myarray, 3.14);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:05:22