🔲13. Организация двумерных массивов (матриц). Статическое и динамическое выделение памяти под матрицу
Способы динамического выделения памяти под матрицу. Передача матриц в функции.
Двумерный массив - это массив одномерных массивов. В одномерном массиве положение элемента определяется одним индексом, а в двумерном — двумя.
Статическое выделение памяти
float mat[4][4];
- создание матрицы 4x4. Первое число - строки, второе - столбцы
Динамическое выделение памяти:
Линейный способ. (Все элементы матрицы будут располагаться друг за другом: сначала все элементы 0 строки, затем все элементы первой и т.д.)
void* alloc_memory_matrix (int row, int col, size_t element_size){
return malloc(row * col* element_size);
}
Стандартный способ выделения памяти.
double** alloc_memory_matrix(int row, int col)
{
double **mat = (double**) malloc(row * sizeof(double*));
if (mat != NULL) {
for (int i = 0; i < row; i++) {
*(mat + i) = (double*) malloc(col *sizeof(double));
if (*(mat + i) == NULL) {
while (--i >= 0)
free (*(mat + i));
free(mat);
mat = NULL;
break;
}
}
}
return mat;
}
Способ выделения памяти единым блоком с сохранением указателей на строки
При таком способе выделения памяти, память сразу же выделяется под указатели на строки и под каждый элемент в частности. Далее устанавливается соответствие между указателем на строку и первым элементом строки.
double** alloc_memory_matrix(int row, int col)
{
double** mat = (double**) malloc(row * sizeof(double*) + row * col * sizeof(double));
double *mat_body = (double*)(mat + row);
for (int i = 0; i < row; i++){
*(mat + i) = mat_body + i * col;
}
return mat;
}
Передача двумерных массивов в функции
int fun(int array[n][m])
int fun(int *array[m])
int fun(int **array)
Last updated