Курсовая работа: Особливості мови програмування С
При звільненні пам'яті, займаної таким масивом, треба діяти в зворотному порядку, спочатку визволяючи рядки, а потім - сам одновимірний масив вказівників.
for (int i=0; i<n; i++)
delete[] а[i];
delete[] а;
До елементів нашого двовимірного динамічного масиву можна звертатися звичайним способом: а[1][2].
Масив вказівників на масиви. Розподіл пам'яті.
По формулі (*) а[1][2]==*(*(a+1)+2). Але, на відміну від звичайного двовимірного масиву, а є покажчиком не на int[4], а на int*. Тому a+1 вказує на наступний елемент типа int* в одновимірному масиві а, тобто на а[1]. Нарешті, оскільки а[1] має типа int*, то а[1]+2 вказує на елемент а[1][2].
Відзначимо, що, на відміну від звичайного двовимірного масиву, рядки нашого динамічного масиву не обов'язково розташовуються в пам'яті послідовно. Саме завдяки цьому структура двовимірного динамічного масиву є надзвичайно гнучкою. Зокрема, для перестановки його рядків досить поміняти місцями покажчики в одновимірному масиві:
int* v=a[1]; а[1]=a[2]; а[2]=v;
Двовимірний динамічний масив дозволяє також зберігати рядки різної довжини. Наприклад, для створення нижнетреугольной матриці можна використовувати наступний фрагмент:
a=new int*[n];
for (int i=0; i<n; i++)
а[i]=new int[i+1];
Одновимірний масив вказівників може також зберігати C-строки, відводячи під них стільки місця, скільки вони займають. Ініціалізація такого масиву при введенні рядків із стандартного потоку cin приводиться нижче:
char* s[10];
char buf[80];
for (int i=0; i<10; i++)
{
cin.getline(buf,80);
s[i]=new char(strlen(buf)+1);
strcpy(s[i],buf);
}
Відзначимо, що масив C-строк також відноситься до двовимірних динамічних масивів з рядками змінної довжини. Зокрема, в алгоритмі сортування при перестановці рядків потрібно міняти місцями лише вказівники [6].
2.1.1.9 Двовимірні масиви як параметри функції
Розглянемо простий випадок:
void print(int а[3][4])
{
for (int i=0; i<3; i++)
{