1

我被要求编写一个获取二维数组(矩阵)、列数和行数的程序,程序将返回转置矩阵(不使用 [][],意味着仅使用指针算术)

我写的程序,确实对矩阵进行了转置,没问题。我的问题是了解如何返回。这是我的代码:

int** transpose_matrix(matrix mat1,int number_of_rows,int number_of_columns)
{
    matrix mat2;
    int row_index,column_index;
    for(row_index=0;row_index<number_of_rows;row_index++)
    {
        for(column_index=0;column_index<number_of_columns;column_index++)
            **(mat2+(column_index*number_of_rows)+row_index)=**(mat1+(row_index*number_of_columns)+column_index);
    }
    // at this point, mat2 is exactly the transpose of mat1
    return mat2;
}

现在这是我的问题:我不能返回一个矩阵,我能做的最接近的事情是返回矩阵的第一个值的地址,但即使我这样做了,只要我这样做,矩阵的所有其余部分都将无法使用退出 transpose_matrix 函数回到 void main...我怎样才能返回 mat2?

4

2 回答 2

0

一、二维数组不是双指针。

二、动态分配。如果matrix是二维数组类型,那么写成这样:

typedef int matrix[ROWS][COLUMNS];
typedef int (*matrix_ptr)[COLUMNS];

matrix_ptr transpose_matrix(matrix m, int rows, int cols)
{
    matrix_ptr transposed = malloc(sizeof(*transposed) * rows);
    // transpose, then
    return transposed;
}
于 2013-03-19T20:40:51.410 回答
0

好的:这里有 3 件事:

  1. 您不能返回指向局部变量的指针(返回后它将是垃圾,并且它所在的堆栈(内存)被重用)。
  2. 传递时数组衰减为指向第一个元素的指针。
  3. 指针运算:p+1 将 p 中的地址增加 sizeof(*p),因此 p 指向下一个元素,而不是下一个字节。

代码的简单修复(这适用于任何矩阵大小):

    int* transpose_matrix(int *mat1,int number_of_rows,int number_of_columns)
    {
        int *mat2=malloc(number_of_rows*number_of_columns*sizeof(int));
        int row_index,column_index;
        for(row_index=0;row_index<number_of_rows;row_index++)
        {
            for(column_index=0;column_index<number_of_columns;column_index++)
                mat2[column_index*number_of_rows+row_index]=mat1[row_index*number_of_columns+column_index];
        }
        // at this point, mat2 is exactly the transpose of mat1
        return mat2;
    }

...
    print(m,r,c); // I hope you have a print()
    int *t=transpose_matrix(m,r,c);
    print (t,c,r);
...
    // use t[max: c-1][max: r-1]
    free(t);

如果我们只有固定大小的矩阵(在 C99 中我们也可以使用可变长度数组!)。

typedef int  Matrix[ROWS][COLUMNS];
typedef int TMatrix[COLUMNS][ROWS];
typedef int (*pMatrix)[COLUMNS]; 
typedef int (*pTMatrix)[ROWS];  

pTMatrix transpose_matrix(Matrix m , int rows, int cols)
{
    pTMatrix t = malloc(sizeof(*t)*cols);
    for (int r=0; r<rows ; ++r)
    for (int c=0; r<cols ; ++r)
      t[c][r]=m[r][c];
    return t;
}

好吧,如果行和列是固定的,你不需要传递它......嗯......

于 2013-03-19T21:10:05.907 回答