Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Динамическая память.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
322.56 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

Національний технічний університет «Харківський політехнічний інститут»

Методичні вказівки

до лабораторної роботи «Використання вказівників у програмах мовою C++»

з курсу «Програмування» для студентів напряму 6.040302 – Інформатика і курсу «Програмування та алгоритмічні мови» для студентів напряму 6.040303 – Системний аналіз

Затверджено редакційно-видавничою радою університету, протокол № 2 від 06.12.12.

Харків НТУ «ХПІ» 2013

Методичні вказівки до лабораторної роботи «Використання вказівників у програмах мовою C++» з курсу «Програмування» для студентів напряму 6.040302 – Інформатика і курсу «Програмування та алгоритмічні мови» для студентів напряму 6.040303 – Системний аналіз / Уклад. М. І. Безменов, О. М. Безменова. – Х. : НТУ «ХПІ», 2013. – 16 с.

Укладачі: М. І. Безменов,

О. М. Безменова

Рецензент І. П. Гамаюн

Кафедра системного аналізу і управління

© Безменов М.І., Безменова О. М., 2013

Вступ

Можливість безпосереднього доступу до пам’яті за допомогою вказів­ників – один з найбільш значущих засобів програмування мовою C++. При робо­ті з вказівниками програмісти досить часто зіштовхуються зі специфіч­ними проблемами, оскільки в деяких ситуаціях механізм роботи вказівників може виявитися доволі заплутаним.

Метою даної лабораторної роботи є практичне освоєння вказівників як засобу доступу до пам’яті, сфери їх використання і операцій, які можуть вико­нуватися над вказівниками.

1.Теоретичні основи

1.1.Загальні відомості про вказівники

У мові C для виділення динамічної пам’яті та її вивільнення використовуються функції calloc(), malloc(), realloc() і free(), заголовки (прототипи) яких описані в заголовковому файлі alloc.h:

void *calloc(unsigned n, unsigned m) – повертає вказівник на початок ділянки динамічної пам’яті для розміщення n елементів по m байт кожен або NULL при невдалому виділенні;

void *malloc(unsigned s) – повертає вказівник на блок динамічної пам’яті довжиною s байт або NULL;

void *realloc(void *bl, unsigned ns) – змінює розмір виділеної динамічної пам’яті з адресою початку bl до розміру ns байт або NULL. Якщо bl == NULL, то функція працює як malloc();

void free(void *bl) – звільнює раніше виділений блок динамічної пам’яті з адресою першого байта bl.

Треба пам’ятати, що функції динамічного розподілу пам’яті мають тип void *. Це обумовлює необхідність приведення типу при зв’язуванні виділе­ної пам’яті з конкретним вказівником:

#include<alloc.h> //. . . char *pchar; long *plong; int n=10; // ... // Виділення 256 байт під символьний масив pchar = (char *)malloc(256); // Виділення пам’яті під масив з n елементів plong = (long *)calloc(n, sizeof(long)); // типу long // ... free(pchar); // Вивільнення пам’яті, що зв’язана з // вказівником pchar free(plong); // Вивільнення пам’яті, що зв’язана з // вказівником plong

На відміну від імені масиву звичайний вказівник може змінювати своє значення. Однак у цьому випадку можна загубити можливість правильного вивільнення пам’яті. Справа в тому, що після розподілу пам’яті вказівник зв’язується з першим байтом виділеної ділянки пам’яті. Якщо ж вказівник змінює своє значення, то вивільнення пам’яті з початку виділеної ділянки стає неможливим. Тому завжди необхідно зберігати адресу початку виділеної ділянки пам’яті.

Важливим моментом є необхідність перевірки правильності виділення пам’яті. Для цього необхідна перевірка значення вказівника після розподілення пам’яті. Наприклад,

if (pchar != NULL) ...

або

if (pchar) ...

У мові C++ існує операція

new ім’я_типу

або

new ім’я_типу ініціалізатор

яка дозволяє виділити ділянку динамічної пам’яті, розмір якої відповідає типу даних, що визначається іменем типу. Ініціалізатор задається виразом у круглих дужках. Якщо пам’ять не може бути виділена, то операція new повертає значення NULL.

Вивільнення пам’яті в мові C++ здійснюється операцією

delete вказівник;

Якщо вивільнюється пам’ять, що виділялася під масив, то операція delete має такий формат:

delete [] вказівник;

У програмі може бути визначений як звичайний вказівник, так і вказівник на масив.

Наприклад,

long *plong; // Вказівник на тип long

long (*plarray)[3][2]; // Вказівник на масив 3х2

Ці вказівники можуть бути зв’язані як з об’єктами статичної пам’яті, так і з об’єктами динамічної пам’яті.