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

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

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

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

до лабораторної роботи «Використання вказівників у програмах мовою 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;