考虑以下代码:
#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矩阵的函数,并在需要的地方链接它们
但后来我遇到了一个问题,如函数printMatrix
,int
数组的大小,在编译时需要matrix
点(即N
)。因此,当大小不同时,我的函数在其他情况下不起作用。
那么,我该如何处理呢? 动态数组是一个解决方案,但我想知道它是否可以用静态数组完成。
答案 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));
}