(2个答案)
How to pass 2D array (matrix) in a function in C?
(4个答案)
2年前关闭。
我是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;
}
但是编译器说:
我必须有签名:
int foo(int mat[][N])
那我该如何传递2D数组呢?
最佳答案
您可以使用宏来定义常数,即#define N 5
。在编译时,定义的宏名称的每个外观都将替换为给定的值。在我们的情况下,每个N将被替换为5。
但这并不能解决您的问题,因为即使您更改数组的尺寸,每次也会打印5。
我创建了一个打印功能,可以向您展示如何访问数组中的元素。因此,该函数的原型(prototype)如下所示: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;
}