Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 357.docx
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.75 Mб
Скачать

Int **a; /* указатель на двумерный массив */

Int ***b; /* указатель на трехмерный массив */

Пусть требуется разместить в динамической памяти матрицу, содержащую n строк и m столбцов. Двумерная матрица будет располагаться в оперативной памяти в форме ленты, состоящей из элементов строк. При этом индекс любого элемента двумерной матрицы можно получить по формуле:

index = i*m+j;

где i - номер текущей строки; j - номер текущего столбца.

Объем памяти, требуемый для размещения двумерного массива, определится как n·m·(размер элемента)

Однако, поскольку при таком объявлении компилятору явно не указывается количество элементов в строке и столбце двумерного массива, традиционное обращение к элементу путем указания индекса строки и индекса столбца a[i][j] является некорректным.

Правильное обращение к элементу с использованием указателя будет строится следующим образом:

*(prt+i*m+j) или *(*(prt+i)+j),

где prt - указатель на массив, m - количество столбцов, i - индекс строки, j - индекс столбца.

Динамические двумерные массивы представляются как массив указателей, например:

int **A;

Первый массив А[0]

Второй массив А[1]

Третий массив А[2]

*(А)

*(А+1)

*(А+2)

Массив указателей **A

Выделение памяти необходимо осуществлять с использованием циклов, сначала выделяется память для указателей на одномерный массив, а потом – элементов каждого одномерного массива.

int **A = (int **)malloc(N*sizeof(int *));

for(int i = 0; i < N; i++) {

A[i] = (int *)malloc(M*sizeof(int));

}

Важно правильно освободить выделенную память. Сначала освобождение памяти занимаемой строками, затем освобождение памяти, занимаемой массивами указателей.

for(int i = 0; i < N; i++) {

free(A[i]);

}

free(A);

Пример. Выделение и высвобождение памяти для многомерного массива

int main() {

// указатель на массив

int **a ,i, j, n, m;

setlocale(0,"Russian");

printf("Введите количество строк: ");

scanf("%d", &n);

printf("Введите количество столбцов: ");

scanf("%d", &m);

// Выделение памяти под массив указателей

a= (int**) malloc(n*sizeof(int*));

// for(i=0; i<n; i++) // цикл по строкам

{

a[i] = (int*)malloc(m*sizeof(int));

for(j=0; j<m; j++) // цикл по столбцам

{

*(*(a+i)+j) = -10+rand()%21;

}

}

// Вывод элементов массива

for(int i=0; i<n; i++) // цикл по строкам

{

for(int j=0; j<m; j++) // цикл по столбцам

{

printf("%5d ",*(*(a+i)+j) ); // 5 знакомест под элемент массива

}

printf("\n");

}

for(int i=0; i<n; i++) // высвобождение памяти занимаемой строками

free(a[i]);

free(a);

system("pause");

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]