Сначала позвольте мне ответить на ваш вопрос об этой строке c:
(*a)[i] = (int*)malloc((*m) * sizeof(int));
Что он делает, так это выделяет массив из ровно *m
целых чисел и сохраняет указатель на него в массив *a
указателей на int
, который ранее был выделен как:
(*a) = (int**)malloc((*n) * sizeof(int*));
Теперь, если все еще неясно, что происходит, переписывание кода более осмысленным образом поможет , Чтобы упростить задачу, вы можете использовать временные переменные для работы и назначать значения указателям, передаваемым в качестве аргументов только в конце функции. Использование более значимых имен также очень помогает.
void read_matrix(int *rows, int *columns, int ***matrix) {
int i, j, r, c;
int **mat;
printf("n = ");
scanf("%d", &r);
printf("m = ");
scanf("%d", &c);
// Allocate space for a matrix (i.e. an array of r integer pointers).
mat = malloc(r * sizeof(int*));
// Allocate space for each row of the matrix (i.e. r arrays of c integers).
for (i = 0; i < r; i++)
mat[i] = malloc(c * sizeof(int));
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
printf("a[%d][%d] = ", i, j);
scanf("%d", &mat[i][j]);
}
}
*rows = r;
*columns = c;
*matrix = mat;
}
Поскольку мы теперь перенесли присвоение значений аргументам в конце функции, мы избавились от всех раздражающих операторов разыменования указателя (*
), и код выглядит чище.
Вы можете видеть, что то, что раньше было:
(*a)[i] = (int*)malloc((*m) * sizeof(int));
, теперь стало:
mat[i] = malloc(c * sizeof(int));
Что гораздо проще Понимаю. Это место для массива (строки матрицы), содержащего c
целых чисел.
То, что раньше было:
(*a) = (int**)malloc((*n) * sizeof(int*));
, теперь стало:
mat = malloc(r * sizeof(int*));
Это выделяет массив из r
целочисленных указателей (что означает матрицу из r
строк, если каждый указатель указывает на строку).