Да - это тройные указатели или указатели на указатели на указатели.Иногда они необходимы, но очень боятся.В этом случае вы выделяете два двумерных массива одинакового размера и должны возвращать два значения по ссылке, поэтому необходимы тройные указатели, по крайней мере, пока вы сохраняете текущий дизайн функции.
Да - adouble *
и int *
- это разные типы;они указывают на разные типы.Вы можете делать соответствующие операции над ними без приведения.Однако, если вы думаете, что можете объединить две параллельные операции в одну, вы, вероятно, ошибаетесь.
Восстановление после ошибки может быть проще, если вы создали несколько подфункций:
static int **alloc_2d_int_array(int nrows, int ncols)
{
...
}
static double **alloc_2d_double_array(int nrows, in ncols)
{
...
}
Ваша основная функция распределения будет тогда просто вызывать эти два последовательно.Если второй сбой, основная функция выделения вызовет очистку для первого выделенного массива.Коду очистки, вероятно, необходим соответствующий размер, поэтому вы, вероятно, должны иметь:
static void free_2d_double_array(int nrows, double **array)
{
...
}
static void free_2d_int_array(int nrows, int **array)
{
...
}
Эти функции могут даже отображаться за пределами источника (не static
).
Вы также можетерассмотрите возможность использования структуры для описания массивов (строк и столбцов) и указателей на массивы.Это также позволит вам избежать явного обозначения тройного указателя.
struct double_array
{
int nrows;
int ncols;
double **array;
};
И т. Д.