Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_C++ (13_1) у.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
349.18 Кб
Скачать

5. Динамічна пам'ять

Під динамічною пам'яттю розуміється пам'ять, яка виділяється під час роботи програми. У мові С/С++ для виділення динамічній пам'яті використовуються покажчики.

Одновимірний масив. Для того, щоб задати пам'ять під одновимірний масив під час роботи програми, необхідно:

  • визначити покажчик, наприклад int *p;

  • задати необхідний розмір n масиву;

  • виконати код p = new int [n].

Програма 11. Використовується покажчик для динамічного виділення пам'яті під одновимірний масив.

Void main()

{ int j,s;

int *data;

cout << "Введи розмір масиву ";

cin >> s; // Введення розміру масиву.

data = new int[s]; // Виділяється динамічна пам'ять для //елементів масиву розмірності s.

cout << “Після ініціалізації в змінній data значення адреси = ”

<< data << “\n”;

cout << "\nРазмер масиву = " << s

<< "\n\n Введи елементи масиву з клавіатури \n";

for (j = 0; j < s; j++)

{ cout << "data[" << j << "]= " ;

cin >> data [j]; // Доступ до елементів масиву через індекс.

} cout << "\nВведен масив: \n";

for ( j = 0; j < s; j++)

cout << data[j] << “ “;// Виведення елементів масиву на екран.

cout << "\n";

delete [] data; // Видаляє пам'ять, яка використовувалася для масиву.

getch();

}

Зауваження 2. Якщо в програмі визначений покажчик, то в принципі без попереднього виділення пам'яті можна використовувати змінну з індексом.

Програма 12. Програма демонструє той факт, що при оголошенні покажчика в програми можна використовувати змінну з індексом без попереднього виділення динамічній пам'яті.

Void main()

{ int j,s;

int *data;

clrscr();

cout << “В змінній data значення адреси = ” << data << “\n”;

cout << "Введи розмір масиву ";

cin >> s;

cout << "\nРозмір массива= " << s << "\n\n Введи масив з клавиатуры\n";

// Динамічну пам'ять НЕ ВИДІЛЯЄМО!

for (j = 0; j < s; j++)

{

cout << "data[" << j << "]= " ;

cin >> data [j]; // Доступ до елементів масиву через індекс.

}

cout << "\nВведен масив: \n";

for (j = 0; j < s; j++)

cout << data[j] << “ “;

cout << "\n";

getch(); }

Зауваження 3. При оголошенні покажчика будь-якого типа програмі стають доступні додаткові області пам'яті, які не знаходяться під її контролем. Використовувати ці області пам'яті не можна, тому що це буде грубою помилкою, яку транслятор мови не виявляє.

Двовимірний масив. Для виділення динамічній пам'яті під матрицю існує два способи.

Перший спосіб полягає в тому, що матриця а[n][m] інтерпретується як одновимірний масив. В цьому випадку динамічна пам'ять під матрицю виділяється як під масив, звідси слідує:

  • визначити покажчик, наприклад int *p;

  • під час роботи програми задати n – число рядків і m – число стовпців в матриці;

  • виконати код p = new int [n * m]. При виконанні даної коди комп'ютер виділяє пам'ять для n * m чисел і адреса пам'яті для першого числа засилає в покажчик р.

В цьому випадку доступ до елементів матриці можливий лише через адреси. Елемент p[i][j] в програмі має бути представлений кодом *(p + i * m + j), якщо в p міститься адреса першого елементу матриці. Адреса елементу p[i][j] представляється виразом (p + i * m + j).

Другий спосіб виділення динамічній пам'яті під матрицю полягає в тому, що спочатку виділяється пам'ять під масив покажчиків:

  • розмір масиву покажчиків дорівнює кількості рядків матриці. А потім виділяється пам'ять під кожен рядок матриці. Для цього треба: визначити покажчик на покажчик, наприклад int **p; під час роботи програми задати n – число рядків і m – число стовпців в матриці;

  • використавши директиву p = new int *[n], виділити пам'ять під масив покажчиків розмірності n;

  • виконавши в циклі директиву p[i]= new int[m], де i = 1, 2, ..., n, виділити пам'ять під масив покажчиків для рядків матриці. При цьому в покажчик p[i] засилає адреса першого елементу i-й рядка.

При такому способі виділення динамічній пам'яті під матрицю доступ до елементів масиву можна здійснювати через індекси, тобто у вигляді p[i][j].

Програма 13. Для виділення динамічній пам'яті під матрицю використовується покажчик.

Соседние файлы в папке Лекції