Динамічним називають такий масив, розмір якого можна змінювати під час виконання програми. Динамічні масиви надають змогу більш гнучко працювати з даними, оскільки дозволяють вводити довільний розмір. Для зміни розміру динамічного масиву мова програмування, що підтримує такі масиви, повинна надавати вбудовану функцію чи оператор. В порівняні зі статичним масивом, динамічний не має фіксованого розміру та може задаватись під час виконання програми. Замість використання змінної типу string можна використовувати масив змінних типу char. У задачах пов'язаних з матрицями, матриці записують, як двовимірний масив. В старих комп'ютерах з малою кількістю оперативної пам'яті, а також при операціях з великою кількістю даних існує загроза повного засмічення пам'яті, тому в кінці програми прийнято видаляти масив.
Розмірність — кількість індексів елемента (одновимірний, двовимірний, …, багатовимірний)
Розмір — загальна кількість елементів у масиві.
Логічний розмір — кількість елементів масиву, які містять якесь значення.
Багатовимірні масиви
Багатовимірні масиви — це по-суті масив з масивів. Наприклад, двовимірний масив можна передати через одновимірний масив, кожний елемент якого є масивом. Часто двовимірні масиви використовують, як таблиці. Приклад створення двовимірного масиву мовою програмування C++:
intN,M;cin>>N>>M;//зчитування змінних(розмірів масиву)int**p=newint*[N];//створення масиву вказівників на одновимірні підмасивиfor(inti=0;i<N;i++){p[i]=newint[M];// створення одновимірного підмасиву}//Операції над масивом// . . .for(inti=0;i<N;i++){delete[]p[i];//Видалення підмасивів}delete[]p;//Видалення масиву вказівників
Зміна розміру масиву
У випадку збільшення логічного розміру, може виникнути необхідність збільшення розміру масиву. При видаленні елементу, необхідно наступним до видаленого елементам присвоїти значення наступного, тобто зсунути елементи масиву вліво. При додаванні, щоб запобігти засміченню пам'яті при зміні розміру масиву багаторазово, його об'єм збільшують вдвічі з метою використання резервного простору для майбутніх операцій. Додавання пам'яті можна реалізувати наступним чином:
function insertEnd(dynarray a, element e)
if (a.size = a.capacity)
a.capacity ← a.capacity * 2
a[a.size] ← e
a.size ← a.size + 1
Переваги та недоліки
Можливість задавати розмір масиву під час виконання програми
Можливість додавати елементи
Засмічення пам'яті
Під час зміни розміру масива, програма може суттєво гальмувати. Для великих об'ємів це може призвести до того що зависання буде відчувати користувач.
//Одновимірний масив з a елементівint*mas=malloc(sizeof(int)*a);// Виділення пам’яті// Двовимірний масив з N рядків по M елементів// Виділення пам’яті для масиву вказівників на одновимірні підмасивиint**A=(int**)malloc(N*sizeof(int*));for(inti=0;i<N;i++){// Виділення пам’яті для одновимірного підмасивуA[i]=(int*)malloc(M*sizeof(int));}// Звільнення пам'яті одновимірного масивуfree(mas);// Звільнення пам'яті двовимірного масивуfor(inti=0;i<N;i++){// Звільнення пам’яті одновимірного підмасивуfree(A[i]);}// Звільнення пам’яті масиву вказівників на одновимірні підмасивиfree(A);
// Створення одновимірного масивуint*mas=newint[a];// Створення двовимірного масиву з N рядків по M елементів// Створення масиву вказівників на одновимірні підмасивиint**p=newint*[N];for(inti=0;i<N;i++){// Створення одновимірного підмасивуp[i]=newint[M];}// Вилучення одновимірного масиву delete[]mas;// Вилучення двовимірного масиву for(inti=0;i<N;i++){// Вилучення одновимірного підмасивуdelete[]p[i];}// Вилучення масиву вказівників на одновимірні підмасивиdelete[]p;
program dynamic_arraysimplicit noneinteger::nx,n,m,iinteger,allocatable,dimension(:)::x,tempinteger,allocatable,dimension(:,:)::ynx=5n=10m=20! створення одновимірного масивуallocate(x(nx))! ініціалізація всього масивуx=1! показуємо масивprint*,'x = ',xprint*,' allocated(x)=',allocated(x)! створення нового масиву вдвічі довшого за попереднійallocate(temp(2*size(x)))! ініціалізація всього масивуtemp=-1! x видаляється і створюється вдвічі довший без копіювання даних, temp видаляєтьсяcall move_alloc(temp,x)print*,' allocated(temp)=',allocated(temp)! показуємо масивprint*,'x = ',xprint*,' allocated(x)=',allocated(x)! вилучення одновимірного масивуdeallocate(x)! створення двовимірного масиву з m рядків по n елементів (в фортрані - спочатку по стовпцях!)allocate(y(n,m))! ініціалізація всього масивуdo i=1,my(:,i)=iend do! показуємо масивprint*,'y = 'do i=1,mprint*,y(:,i)enddo! вилучення двовимірного масивуdeallocate(y)end program dynamic_arrays