在函数中传递矩阵(C)
我有一个问题将矩阵传递给C中的函数。我想要创建的函数:
void ins (int *matrix, int row, int column);
但我注意到与矢量相反,矩阵给我一个错误。 如何将矩阵传递给函数呢?
编辑 – >有代码:
// Matrix #include #define SIZE 100 void ins (int *matrix, int row, int column); void print (int *matrix, int row, int column); int main () { int mat[SIZE][SIZE]; int row, col; printf("Input rows: "); scanf ("%d", &row); printf("Input columns: "); scanf ("%d", &col); printf ("Input data: \n"); ins(mat, row, col); printf ("You entered: "); print(mat, row, col); return 0; } void ins (int *matrix, int row, int column); { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < column; j++) { printf ("Row %d column %d: ", i+1, j+1); scanf ("%d", &matrix[i][j]); } } } void print (int *matrix, int row, int column) { int i; int j; for(i=0; i<row; i++) { for(j=0; j<column; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } }
您必须将维数作为指针传递,
即如果你的矩阵是2D(10乘100),那么:
void ins (int **matrix, int row, int column);
但前面的错误,因为任何静态2D数组都要求第二级指针是指向静态数组的const
指针。 如果矩阵是动态数组,则前一个标题将是正确的。 所以正确的是:
void ins (int (*matrix)[100], int row, int column);
或者在你的情况下:
void ins (int (*matrix)[SIZE], int row, int column);
或者干脆:
void ins (int matrix[10][100], int row, int column);
或者在你的情况下:
void ins (int matrix[SIZE][SIZE], int row, int column);
如果您有现代C编译器,则可以对任何大小的2D矩阵执行以下操作
void ins (size_t rows, size_t columns, int matrix[rows][columns]);
重要的是尺寸在矩阵之前,因此它们是已知的。
在函数内部,您可以轻松地以matrix[i][j]
访问元素,并且编译器正在为您执行所有索引计算。
也可以将第一个维度留空,与(*矩阵)相同:
void ins (int matrix[][100], int row, int column);
C – 在函数中分配矩阵
上面你会发现我用C(gcc C11 / C99)以任何可能的方式分配和操作矩阵的函数。
更好的方法是使用malloc函数并创建动态分配的数组,并使用2d数组做任何你想做的事情:
#include #include #include void fun(int **arr,int m,int n) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } } int main() { int i,j,m,n; printf("enter order of matrix(m*n)"); scanf("%d*%d",&m,&n); int **a=(int **)malloc(m*sizeof(int)); for(i=0;i #include #include void fun(int **arr,int m,int n) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } } int main() { int i,j,m,n; printf("enter order of matrix(m*n)"); scanf("%d*%d",&m,&n); int **a=(int **)malloc(m*sizeof(int)); for(i=0;i