在函数中传递矩阵(C语言)

16

我在C语言中遇到了将矩阵传递给函数的问题。这是我想要创建的函数:

void ins (int *matrix, int row, int column);

但是我注意到,与向量不同的是,矩阵会导致错误。我该如何将我的矩阵传递给函数?

编辑--> 这是代码:

// Matrix

#include <stdio.h>
#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");
    }
}

你的矩阵有多少维?是一维还是二维的? - user586399
可能是重复的 https://dev59.com/MHRB5IYBdhLWcg3wtJGF#11274267 - Ulterior
5个回答

37

您需要传递一个指针,并使用与矩阵维数相同的间接级别(*)。

例如,如果您的矩阵是二维的(例如 10x100),那么:

void ins (int **matrix, int row, int column);

如果您有一个固定的尺寸(例如100),您也可以这样做:
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);

谢谢。如果我有一个常量维度(请查看我的编辑)定义为SIZE,我需要如何更改代码? - Lc0rE
2
在 OP 的示例中,无法通过“具有与矩阵维数相同的间接级数 (*) 的指针”传递 2D 数组。回答中的这部分完全是错误的。 - AnT stands with Russia

14

如果您拥有现代的C编译器,您可以对任意大小的2D矩阵执行以下操作

void ins (size_t rows, size_t columns, int matrix[rows][columns]);

重要的是,尺寸应该在矩阵之前给出,这样它们就可以被识别。

在你的函数内部,你可以很容易地访问元素,如matrix[i][j],编译器会为你完成所有索引计算。


2

还可以将第一维保留为空,与(*matrix)相同:

void ins (int matrix[][100], int row, int column);

0
更好的使用malloc函数和创建动态分配数组的方法,可以使用2D数组来进行任何你想做的操作:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

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<n;i++)
        a[i]=(int *)malloc(n*sizeof(int));

    fun(a,m,n);
    for (i = 0; i < m; i++)
    {
    for (j = 0; j < n; j++)
        {
        printf("%d ", a[i][j]);
        }
        printf("\n");

    }
    return 0;
}

 output:
     #include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

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<n;i++)
        a[i]=(int *)malloc(n*sizeof(int));

    fun(a,m,n);
    for (i = 0; i < m; i++)
    {
    for (j = 0; j < n; j++)
        {
        printf("%d ", a[i][j]);
        }
        printf("\n");

    }
    return 0;
}

-1

你也可以尝试这个:

void inputmat(int r,int c,int arr[r * sizeof(int)][c * sizeof(int)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接