Как сделать массив матричных указателей? - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу создать массив указателей матрицы.

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

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

Я пытаюсь выяснить, как создать массив указателей для вызова этих матриц.

matrix [0] [0] [0] должен возвращать 1, а матрица [1] [1] [1] должна возвращать 4.

До сих пор я пробовал этот метод, но получаю ошибку ошибки сегментации.

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

1 Ответ

0 голосов
/ 17 декабря 2018

Давайте сначала предположим, что 2D-массивы:

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?

Структуры такого рода, которые вы можете легко поместить в массивы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...