
- •Методичні вказівки
- •1.Теоретичні основи
- •1.1.Загальні відомості про вказівники
- •1.2.Операції з вказівниками
- •Присвоювання
- •Розіменування
- •Отримання адреси
- •Підсумовування і віднімання
- •Інкремент і декремент
- •Індексування
- •1.3.Константи і вказівники
- •1.4.Вказівники і масиви
- •2.Приклади програм
- •3.Завдання на лабораторну роботу
- •4.Варіанти задач
- •5.Контрольні запитання
- •Список літератури
- •61002, Харків, вул. Фрунзе, 21.
- •61002, Харків, вул. Фрунзе, 21.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний технічний університет «Харківський політехнічний інститут»
Методичні вказівки
до лабораторної роботи «Використання вказівників у програмах мовою C++»
з курсу «Програмування» для студентів напряму 6.040302 – Інформатика і курсу «Програмування та алгоритмічні мови» для студентів напряму 6.040303 – Системний аналіз
Затверджено редакційно-видавничою радою університету, протокол № 2 від 06.12.12.
Харків НТУ «ХПІ» 2013
Методичні вказівки до лабораторної роботи «Використання вказівників у програмах мовою C++» з курсу «Програмування» для студентів напряму 6.040302 – Інформатика і курсу «Програмування та алгоритмічні мови» для студентів напряму 6.040303 – Системний аналіз / Уклад. М. І. Безменов, О. М. Безменова. – Х. : НТУ «ХПІ», 2013. – 16 с.
Укладачі: М. І. Безменов,
О. М. Безменова
Рецензент І. П. Гамаюн
Кафедра системного аналізу і управління
© Безменов М.І., Безменова О. М., 2013
Вступ
Можливість безпосереднього доступу до пам’яті за допомогою вказівників – один з найбільш значущих засобів програмування мовою C++. При роботі з вказівниками програмісти досить часто зіштовхуються зі специфічними проблемами, оскільки в деяких ситуаціях механізм роботи вказівників може виявитися доволі заплутаним.
Метою даної лабораторної роботи є практичне освоєння вказівників як засобу доступу до пам’яті, сфери їх використання і операцій, які можуть виконуватися над вказівниками.
1.Теоретичні основи
1.1.Загальні відомості про вказівники
Кожна змінна в програмі – це об’єкт, що має ім’я і значення. З точки зору машинної реалізації ім’я змінної відповідає адресі тієї ділянки пам’яті, яка виділена цій змінній, а значення змінної – умісту цієї ділянки пам’яті.
Щоб отримати адресу, у мові C++ використовують унарну операцію &. Таким чином, якщо змінна має ім’я v, то її адресою є &v. Операція & може застосовуватися тільки до об’єктів, які мають ім’я і розміщені в пам’яті. Вона не застосовується до констант, виразів, бітових полів структур, регістрових змінних, файлів.
Для зберігання адрес використовують змінні спеціального типу – «вказівники». При цьому значенням вказівника є адреса змінної конкретного типу, і не можна у вказівниках одного типу зберігати адреси змінних іншого типу.
При описанні або визначенні вказівника найпростішим є використання такого формату:
тип *ім’я змінної;
Наприклад:
char *ch; int *n1, *n2; double *f;
Тут символ * – це операція розіменування, яка застосовується до адреси. Результатом цієї операції є об’єкт, на який указує вказівник. Таким чином, *n1 – це змінна типу int, а n1 – адреса, за якою зберігається значення типу int.
Зі сказаного раніше випливає, що оператор
n1 = n2;
є коректним, а оператор
n1 = ch;
некоректний, оскільки в останньому випадку типи лівої і правої частин не співпадають, і для виконання оператора треба застосувати операцію перетворення типу:
n1 = (int*) ch;
У C++ визначений тип void, якому відповідає відсутність значення. Не можна оголосити змінну типу void, але вказівник на тип void визначити можна, і такому вказівнику без додаткового перетворення можна присвоїти вказівник на будь-який тип (але не навпаки – у цьому випадку треба перетворювати тип).
У заголовковому файлі stdio.h, а також у деяких інших заголовкових файлах визначена константа NULL, яка позначає посилання на неіснуючу адресу (умовне нульове значення вказівника). Це значення без перетворення типу можна записувати в будь-який вказівник.
Якщо при визначенні вказівника не здійснювалася його ініціалізація, то він не може використовуватися у виразах, в операторі присвоювання і функціях уведення даних. Тому рекомендується здійснювати ініціалізацію вказівника при його визначенні. Це можна зробити одним з двох способів:
тип *ім’я_вказівника = вираз_що_ініціалізує;
або
тип *ім’я_вказівника (вираз_що_ініціалізує);
Вираз_що_ініціалізує може бути
явно заданою адресою:
char *p_char = (char *)0xB8000000;
вказівником, що вже має значення:
char *p_char = (char *)0xB8000000; char *p_screen = pchar;
виразом, який дозволяє отримати адресу за допомогою операції &:
char *ch; char *pt = &ch;