以2D数组为参数调用函数

时间:2018-12-10 18:46:13

标签: c

我是Java开发人员,而不是C程序员。我正在尝试调用一些接收2D数组的函数,就像这样:

#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])

那我应该如何传递2D数组?

2 个答案:

答案 0 :(得分:1)

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

  

将数组的尺寸作为参数传递。

     

您可以将2D数组作为指针传递。

我创建了一个打印功能,可以向您展示如何访问数组中的元素。因此,该函数的原型如下所示:

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;
}

答案 1 :(得分:0)

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

函数foo正在接收指针。与Java不同,C处理指针而不是对象,它没有任何有关接收到的内容的信息,只是它是一个包含指向整数的地址的指针。因此,该函数不知道(或关心)您的数组大小为N(无论您是否提到N)。

调用printf时,内存N中没有任何内容,这可以解释该错误。

您总是可以发送第二个参数,该参数是一个整数,用于指定大小并打印该参数。

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

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