在C中将静态分配的2D数组作为函数参数传递

时间:2010-02-16 19:31:53

标签: c multidimensional-array

考虑以下代码:


#include <stdio.h>
#define N 5
void printMatrix(int (*matrix)[N],int n)
{
   int i,j;
   for(i=0;i<n;i++){
      for(j=0;j<n;j++)
        printf("%d",matrix[i][j]);
     printf("\n");
   }
}
int main()
{
   int R[N][N]={{1,2,3},{4,5,6},{7,8,9}};
   printMatrix(R,3);
}

这可以正常工作。
现在,我想在单独的源文件中编写处理2D矩阵的函数,并在需要的地方链接它们 但后来我遇到了一个问题,如函数printMatrixint数组的大小,在编译时需要matrix点(即N)。因此,当大小不同时,我的函数在其他情况下不起作用。

那么,我该如何处理呢? 动态数组是一个解决方案,但我想知道它是否可以用静态数组完成。

5 个答案:

答案 0 :(得分:7)

如果在编译时未知两种尺寸,则无法使用内置2D数组类型。内置的2D数组必须在编译时至少知道两种大小中的一种。

如果两个大小都是运行时值,那么你别无选择,只能使用2D数组的“手动”实现,例如指向数组的指针数组。在这种情况下,函数声明可能如下所示(两个可选的等效形式)

void printMatrix(int *const *matrix, int n, int m);
void printMatrix(int *const matrix[], int n, int m);

要访问数组元素,您仍然可以使用“传统”语法

matrix[i][j]

数组本身将按如下方式创建(一个简单的例子)

int row0[] = { 1, 2, 3 };
int row1[] = { 4, 5, 6 };

int *matrix[2];
matrix[0] = row0;
matrix[1] = row1;

printMatrix(matrix, 2, 3);

但是如果你已经将矩阵实现为内置的2d数组

int matrix[2][3] = { ... };

然后只是为了能够将它传递给上面的函数,你可以通过使用一个额外的临时“行指针”数组将其“转换”为上面的形式

int *rows[2];
rows[0] = matrix[0];
rows[1] = matrix[1];

printMatrix(rows, 2, 3);

答案 1 :(得分:2)

给自己写一个宏:

#define MAT(i,j) matrix[i*n + j];

并将“matrix”声明为指向“int”的简单指针。

答案 2 :(得分:2)

自己计算数组索引。这将处理任意二维数组,例如:

void printMatrix(int *matrix,int n, int m)
{
   int i,j;
   for(i=0;i<n;i++){
    for(j=0;j<m;j++)
     printf("%d",matrix[m * i + j]);
   printf("\n");
   }
}

答案 3 :(得分:1)

不要试图将其作为二维数组传递;将指针传递给第一个元素,然后手动计算偏移量:

void printMatrix(int *a, size_t m, size_t n)
{
  size_t i,j;
  for (i = 0; i < m; i++)
  {
    for (j = 0; j < n; j++)
    {
      printf("a[%lu][%lu] = %d\n",
       (unsigned long) i, 
       (unsigned long) j, 
       a[i*n+j]); // treat a as 1-d array, compute offset manually
    }
  }
}

int main(void)
{
  int arr[5][4];
  ...
  printMatrix(&arr[0][0], 5, 4);
  ...
}

当然,这只适用于连续分配的数组。

答案 4 :(得分:0)

虽然语法不完全相同,但这也有点工作:


#include <stdio.h>
#define N 5
void printMatrix(int* row,int n,int sz)
{
   int i,j;
   int *currRow;
   for(i=0;i<n;i++){
      currRow = row+i*sz;
      for(j=0;j<n;j++)
        printf("%d",currRow[j]);
     printf("\n");
   }
}
int main()
{
   int R[N][N]={{1,2,3},{4,5,6},{7,8,9}};
   printMatrix(R[0],3,sizeof(R[0])/sizeof(int));
}