任何尺寸的印刷矩阵

时间:2011-03-27 07:47:42

标签: c matrix

我有这个方法用于prinitng:

void printMatrix(int matrix[][3]){
  int i = 0, j = 0;
  int leni, lenj;

  leni = sizeof matrix / sizeof matrix[0][0];
  lenj = sizeof (matrix[0]) / sizeof (matrix[0][0]);

for(i = 0 ; i < leni ; i++)
{
    for(j = 0 ; j < lenj ; j++)
    {
        printf("%d  ", matrix[i][j]);
    }
    printf("\n");
}
printf("\n");

}

和矩阵:

int A[2][3] = {{1, 3, 4},
               {2, 0, 1},

并且这个方法只用2 x 3写我的矩阵,我正在进行研究,leni和lenj返回非常糟糕的数字,问题将出现在void vypisMatice(int matrix[][3]){我宣布矩阵的列数,但是没有这个数字,编译器将无法编译我的应用程序。我只是想知道如何在打印时调整我的方法来接受任何大小的矩阵,比如printMatrix(A);?

由于

3 个答案:

答案 0 :(得分:2)

请注意,在函数声明中,数组类型的任何参数都将转换为相应指针类型的参数。

void printMatrix(int matrix[][3]);

声明与

相同的功能
void printMatrix(int (*matrix)[3]);

matrix参数是指向三个int数组的指针。当您将A传递给函数时,实际传递的是指向数组的第一个元素的指针,即int (*)[3]

此计算sizeof matrix / sizeof matrix[0][0]给出指针的大小除以int的大小,这与原始数组的成员数无关。无法根据传入的参数确定此数字。您需要将外部数组的尺寸明确传递给函数。

当您声明一个数组时(即使在将要转换为指针类型的函数声明中),数组元素类型必须是完整类型。如果不为数组类型提供整数常量类型,则该数组的类型不完整。在您的情况下,因为int[]是完整类型,类型int[][]是非法的,您必须提供多层数组类型中的顶级维度。

如果您使用C99功能(注意,而不是C ++兼容),那么您可以使用可变长度数组(VLA),但在函数定义中,数组参数的内部数组的长度必须仍然作为附加参数传递。

E.g。

void printMatrix(int leni, int lenj, int[][lenj])
{
    // ...
}

答案 1 :(得分:1)

leni = sizeof matrix / sizeof matrix[0][0];它不计算行数。它实际上没有计算任何东西。

最好的方法是明确提供leni和lenj作为附加参数,例如void printMatrix(int *matrix, int leni, int lenj)

另外你应该知道没有办法确定一些随机数组的大小,因为它只是一个没有任何元信息的指针。

答案 2 :(得分:0)

如果您需要接受任意大小的矩阵,则需要在printMatrix()中包含参数,告诉它您的数组大小。类似的东西:

void printMatrix(int *matrix, int rows, int columns)

然后,您可以使用rowscolumns参数来控制打印例程中的循环,而不是自己计算它们。