C-这是返回二维数组的有效方法



给定以下 C -code:

#include <stdio.h>
int mat1[2][4] = {
    {9, 10, 11, 12},
    {13, 14, 15, 16}
};
int (*(transpose)(int matrix[][4]))[2] {
    static int mat[4][2];
    int i;
    int j;
    printf("I am the function transpose()nand I'm transposing 2x4 matrices.nn");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 4; j++) {
            mat[j][i] = matrix[i][j];
        }
    }
    return mat;
}
int main() {
    int (*mat_transpose)[2];
    int i;
    int j;
    mat_transpose = transpose(mat1);
    for (j = 0; j < 2; j++) {
        for (i = 0; i < 4; i++) {
            printf("mat_transpose[%d][%d] = %dn", i, j, mat_transpose[i][j]);
        }
    }
    return 0;
}

功能transpose()返回二维数组(或者是指向一系列指针的指针。)。这是实现这一目标的有效方法吗?浏览各种堆叠式问题,似乎没有这样做的标准方法,而是很多。返回二维或多维阵列有一些标准吗?

最好的解决方案是分配呼叫者函数中的数组,例如

#include <stdio.h>
void transpose(int rows, int columns,
        int matrix[rows][columns], int mat[columns][rows])
{
    int i;
    int j;
    printf("I am the function transpose()n");
    printf("And I'm transposing 2x4 matrices.nn");
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < columns; j++)
        {
            mat[j][i] = matrix[i][j];
        }
    }
}
int main()
{
    int mat1[2][4] =
    {
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };
    int mat_transpose[4][2];
    int i;
    int j;
    transpose(2, 4, mat1, mat_transpose);
    for (j = 0; j < 2; j++)
    {
        for (i = 0; i < 4; i++)
        {
            printf("mat_transpose[%d][%d] = %dn", i, j, mat_transpose[i][j]);
        }
    }
    return 0;
}

,当您将其作为参数传递时,将mat1作为全局变量绝对没有意义。

这是返回二维数组的有效方法吗?

是。将指针返回到static本地变量是有效的。我建议的一件事是您可以 typedef返回类型

typedef matx[2];  
matx *transpose(int matrix[][4])){ /* Function body */ }

它是有效的,因为它做了它声称要做的事情,但我想您已经知道了。

我认为没有返回n维数组的标准,只有最佳实践。

关于您的功能,我唯一可以说的是它缺乏通用(您仅处理2*4矩阵),但这也许不是您的目标。

您应该拥有您的功能

    int **transpose(int **matrix, int row, int columns)
    {
       int **mat;
       // Malloc you array, copy what you need and return it
       ...
    }

行和列是int **matrix

的行数和列

最新更新