返回二维数组的问题

时间:2013-03-19 20:36:06

标签: c pointers matrix return transpose

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

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

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?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

好的:这里有三件事:

  1. 您不能返回指向局部变量的指针(它将是垃圾 返回之后和重用的堆栈(内存)。)
  2. 数组衰减到传递时指向第一个元素。
  3. 指针算术:p + 1将p中的地址增加sizeof(* p),所以 p指向下一个元素,而不是下一个字节。
  4. 代码的简单修复(适用于任何矩阵大小):

        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;
    }
    

    好吧,如果修复了行和列,你就不需要传递它......嗯......