【问题标题】:Invoke function with 2D array as parameter [duplicate]以二维数组为参数调用函数[重复]
【发布时间】:2019-05-11 17:10:39
【问题描述】:

我是 Java 开发人员,而不是 C 程序员。我正在尝试调用一些接收二维数组的函数,尝试如下:

#include <stdio.h>
int foo(int mat[][N])
{ 
  printf("%d",N); /*  <--- here error */

}

int main()
{
    int a[5][5] =
    {
        {1, 2, 3, 4,5},    
        {1, 5, 5, 5,2},    
        {1, 4, 30,4,2},
        {1, 2, 2,2, 2},
        {1,1, 1,1,  2 } 
    };

    foo(a);
    return 0;
}

但是编译器说:

'N' 未声明(在此函数中首次使用)

我必须有签名:int foo(int mat[][N])

那我应该如何传递二维数组呢?

【问题讨论】:

  • 你应该定义N
  • 'N' undeclared。声明N
  • 但它不知道a5X5 矩阵? @EugeneSh。
  • @Malwarey 会怎样?把自己放在编译器的位置。您正在为源文件生成代码。在预处理器完成从#includes 中吸收所有内容并执行宏扩展等之后,您将开始实际编译源代码,您在这里看到的第一件事是int foo(int mat[][N])。现在,你怎么知道N 当时是什么?它不是由编译器推断或推导出来的。这不是 C 的工作方式。
  • C 数组是连续的内存块。他们不“记住”自己的大小。

标签: c


【解决方案1】:

您可以使用宏来定义常数,即#define N 5。在编译时,定义的宏名称的每个外观都将替换为给定的值。在我们的例子中,每个 N 将被替换为 5。 但这并不能解决您的问题,因为它每次都会打印 5,即使您更改了数组的尺寸。

将数组的维度作为参数传递。

您可以将二维数组作为指针传递。

我创建了一个打印函数,我可以向您展示如何访问数组中的元素。所以函数的原型应该是这样的:

void print2DMatrix(int *matrix2D, const int rowLength, const int columnLength);

其中matrix2D是一个指针,这里会传递数组的地址。其他两个参数告诉我们数组的维度。

我们可以使用matrix2D[selectedRow * maxRowLength + selectedColumn]访问选定行和选定列中的元素

调用函数时,可以传入数组名,如print2DMatrix(*myMatrix, myRowLength, myColumnLength);,当然使用前要先声明初始化。 print2DMatrix(myMatrix, myRowLength, myColumnLength); 会引起警告,因为传递的参数和等待的参数类型不同,但它会正确运行。传递的指针是双指针,等待的指针是单指针。因此,您必须使用print2DMatrix(*myMatrix, myRowLength, myColumnLength);,其中 *myMatrix 将指向我们数组的第一行。

我要提一下 myMatrix*myMatrix 指向同一个地址,区别在于:myMatrix 被视为双精度指向整数的指针,当 *myMatrix 被视为指向整数的指针时。运行printf("%d %d %d", myMatrix, *myMatrix, **myMatrix); 以查看结果。 **myMatrix 将指向第一行的第一个元素,即 11。请参阅下面的完整代码...

#include <stdio.h>

#define ROW_LENGTH      5
#define COLUMN_LENGTH   5

void print2DMatrix(int *matrix2D, const int rowLength, const int columnLength)
{
    int i;
    for (i = 0; i < rowLength; i++)
    {
        int j;
        for (j = 0; j < columnLength; j++)
        {
            printf("%d ", matrix2D[i * rowLength + j]);
        }
        printf("\n");
    }
}

int main(void)
{
    const int myRowLength = ROW_LENGTH;
    const int myColumnLength = COLUMN_LENGTH;
    int myMatrix[ROW_LENGTH][COLUMN_LENGTH] =
    {
        {11, 12, 13, 14, 15},
        {21, 22, 23, 24, 25},
        {31, 32, 33, 34, 35},
        {41, 42, 43, 44, 45},
        {51, 52, 53, 54, 55}
    };

    print2DMatrix(*myMatrix, myRowLength, myColumnLength);

    return 0;
}

【讨论】:

  • 非常感谢您的回答,@Norbert Incze。您能否解释一下为什么要使用 matrix2D[selectedRow * maxRowLength + selectedColumn] 访问每个元素?
【解决方案2】:

您正在尝试打印一个不存在的值。 N 不是声明的变量。

函数foo 正在接收一个指针。与 java 不同,C 处理的是指针,而不是对象,它没有任何关于它接收到什么的信息,除了它是一个包含指向 int 的地址的指针。因此,该函数不知道(或关心)您的数组大小为N(不管您是否提到N)。

当您调用 printf 时,内存中没有任何内容称为 N,这解释了错误。

您总是可以发送第二个参数,它是一个指定大小的 int 并打印该参数。

void foo(int[][] mat, int matSize){
  printf("%d\n",matSize);
}

请注意我如何使用int[][] 这是为了简化和说明这只是一个指针的事实。

【讨论】:

  • 注意void foo(int [][] mat, int matSize)不是C。下标会出现在mat之后,至少第二个需要指定维度。
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2018-10-05
  • 2017-11-26
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多