【问题标题】:How to do an array of matrix pointers?如何做一个矩阵指针数组?
【发布时间】:2019-05-18 05:36:16
【问题描述】:

我想创建一个矩阵指针数组。

int matrix1[4][1] = {
    {1} , 
    {2} ,
    {3} ,
    {4}
};

int matrix2[2][2] = {
    {1, 2} , 
    {3, 4}
};

我试图弄清楚如何创建一个指针数组来调用这些矩阵。

matrix[0][0][0] 应该返回 1,matrix[1][1][1] 应该返回 4。

到目前为止,我已经尝试过这种方法,但我遇到了分段错误错误。

int *** matrix = (int ***)malloc(2 * sizeof(int **));
matrix[0] = &matrix1;
matrix[1] = &matrix2;

【问题讨论】:

  • 两个矩阵的大小必须相同
  • 你怎么能分配这些矩阵?您是否启用了警告?使用typedef struct { int * data; int num_rows; int num_cols; } Matrix; 之类的东西,并定义创建矩阵并对其元素进行操作的函数。要理解为什么这行不通,想想当你写matrix[0][2][1]时编译器必须做什么。

标签: c arrays pointers matrix


【解决方案1】:

让我们先假设二维数组:

int x[2][2];

x[0] 的类型现在是 不是 int*,它是 int[2]。同样,&x[0] 不是int** 类型,而是int(*)[2]。你之前可能没见过,它是一个指向两个元素数组的指针。

如果现在x 衰减为指针,它会衰减为完全相同的指针类型 (int(*)[2])。

不幸的是,指向不同大小数组的指针不兼容(int(*)[10]int(*)[12] 无关——除了共享相同的底层类型)。因此,除非您使用 void* 指针,否则您将无法将它们放入同一个数组中。但是您会丢失有关数组大小的任何信息,因此很可能这不是要走的路。

我个人会推荐一个结构:

typedef struct
{
    size_t rows;
    size_t columns;
    int*   data;
} matrix;

结合一些助手:

int get(matrix* m, int r, int c)
{
    return m->data[m->columns * r + c];
}

// perhaps yet setter, constructing and destructing functions?

您可以轻松地将这种结构放入数组中...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 2021-12-10
    • 1970-01-01
    • 2019-07-23
    • 2020-08-04
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多