Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
відповіді ооп( більше половини).docx
Скачиваний:
8
Добавлен:
21.09.2019
Размер:
165.75 Кб
Скачать

34. Охарактеризуйте поняття вказівника і посилання. Їх основні відмінності.

Змінні, значеннями яких є адреси ділянок пам’яті, називаються вказівниками. Вказівник вказує на початок області оперативної пам'яті комп'ютера, де зберігається дане. Вказівники дають змогу оперувати не з іменами даних, а безпосередньо звертатись до областей пам'яті комп'ютера

В С++ існує три види вказівників : 1)на об’єкти; 2)на функції; 3)на void.

1) Вказівник на об’єкти містить адреси ділянок пам’яті, де зберігаються значення певного типу. Формат запису наступний:

<тип> *<ім’я вказівника>

Наприклад int *a, *b; float *c, *d;

Надати значення вказівникам можна так:

<ім’я вказівника> = <адреса змінної>

Приклад. Нехай у програмі оголошені змінні

int n = 10;

float stud1, stud2, stud3;

Тоді можна визначити вказівники на ці змінні:

nomer = &n; rist = &stud1; rist = &stud3;

Вказівники застосовують, зокрема, для надання значень змінним:

rist = &stud1;

*rist = 1.85;

Тут вказівник rist вказуватимемо на адресу змінної stud1, a власне змінній stud1 буде присвоєно значення 1.85.

Вказівники можна переадресовувати. Зокрема, у прикладі вказівнику rist спочатку присвоєно адресу змінної stud1, а потім – адресу змінної stud3. Це правило не діє, якщо вказівник є сталою. Сталий вказівник, який вказує на одну і ту ж адресу, оголошують так:

const int *rik;

Для вказівників в залежності від ОС та версії компілятора резервується 2 або 4 байти в оперативній пам’яті.

2) Вказівник на функцію містить адресу в сегменті коду, за якою розташовується виконуваний код функції, тобто адресу, на яку передається керування в момент виклику функції. Вказівник на функцію використовують для опосередкованого виклику функції (не через її ім’я, а через вказівник, який містить її адресу), а також для передачі імені функції в іншу в якості параметра.

Формат запису: <тип> (*<ім’я>) (список типів, аргументів)

Наприклад int (*abc) (double, double);

3) Вказівнику на void можна присвоїти значення будь-якого вказівника і порівнювати його з довільним вказівником, але перед виконанням будь-яких дій з ділянкою пам’яті, на яку він посилається, потрібно зводити його до вказівника на конкретний тип явним чином.

Особливо ефективною є робота з вказівниками на рядки та масиви.

Посилання – це синонім імені, вказаного при ініціалізації посилання.

Формат опису <тип> &<ім’я>

Приклад. int k; int &h = k;

Посилання – це розіменований вказівник. Тобто, h – альтернативне ім’я для k. Посилання, на відміну від вказівника, не займає додаткової пам’яті і є просто іншим іменем величини. Посилання обов’язково слід присвоювати при описі.

Типові обмеження та помилки програмування при роботі з посиланнями.

Обмеження:

  1. Не можна взяти адресу змінної типу посилання.

  2. Забороняється використовувати масиви посилань

  3. Не допускаються посилання на бітові поля.

  4. Не можна створити вказівник на посилання.

Помилки:

  1. При оголошенні множини посилань & не вказується для кожного посилання.

  2. При оголошенні змінна-посилання на ініціалізована.

  3. Спроба присвоїти попередньо оголошене посилання як псевдонім іншої змінної.

  4. Повернення вказівника або посилання автоматичній змінній у функцію, яку викликають.