
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний технічний університет «Харківський політехнічний інститут»
Методичні вказівки
до лабораторної роботи «Використання вказівників у програмах мовою 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
Ці вказівники можуть бути зв’язані як з об’єктами статичної пам’яті, так і з об’єктами динамічної пам’яті.