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

sud*_*03r 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

AnT*_*AnT 7

如果在编译时不知道这两种大小,则无法使用内置的2D数组类型.内置的2D数组必须至少具有编译时已知的两种大小中的一种.

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

void printMatrix(int *const *matrix, int n, int m);
void printMatrix(int *const matrix[], int n, int m);
Run Code Online (Sandbox Code Playgroud)

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

matrix[i][j]
Run Code Online (Sandbox Code Playgroud)

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

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

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

printMatrix(matrix, 2, 3);
Run Code Online (Sandbox Code Playgroud)

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

int matrix[2][3] = { ... };
Run Code Online (Sandbox Code Playgroud)

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

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

printMatrix(rows, 2, 3);
Run Code Online (Sandbox Code Playgroud)