Покажчики

Коли компілятор обробляє оператора визначення змінної, наприклад, int i =10, він виділяє пам'ять відповідно до типу (int) і ініціалізував її вка-заним значенням (10). Всі звернення в програмі до змінної по її імені (i) замінюються компілятором на адресу області пам'яті, в якій зберігається значення змінної. Програміст може визначити власні змінні для зберіган-ня адрес областей пам'яті. Такі змінні нази-ваються покажчиками. Отже, покажчики призначені для зберігання адрес областей пам'яті. У C++ розрізняють три види покажчиків – покажчики на об'єкт, на функцію і на void, що відрізняються властивостями і набором допустимих операцій. Покажчик не є самостійним типом, він завжди пов'язаний з яким-небудь іншим конкретним типом.

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

тип (*ім'я) ( список_типов_аргументов );

Наприклад, оголошення:

int (*fun) (double, double);

 

задає покажчик з ім'ям fun на функцію, що повертає значення типу int і що має два аргументи типу double.

Покажчик на об'єкт містить адресу області пам'яті, в якій зберігаються дані певного типа (основного або складеного). Просте оголошення покажчика на об'єкт (надалі званого просто покажчиком) має вигляд:

 

тип *имя;

 

де тип може бути будь-яким, окрім посилання і бітового поля, причому тип може бути до цього моменту тільки оголошений, але ще не визна-чений (отже, в структурі, наприклад, може бути присутнім покажчик на структуру того ж типа).

Зірочка відноситься безпосередньо до імені, тому для того, щоб ого-лосити декілька покажчиків, потрібно ставити її перед ім'ям кожного з них. Наприклад, в операторі

int *a, b *с;

описуються два покажчики на ціле з іменами а, с, а також ціла змінна b.

Розмір покажчика залежить від моделі пам'яті. Можна визначити покажчик на покажчик і т.д.

Покажчик на void застосовується в тих випадках, коли конкретний тип об'єкту, адресу якого потрібно зберігати, не визначений (наприклад, якщо в одній і тій же змінній в різні моменти часу потрібно зберігати адреси об'єктів різних типів).

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

Покажчик може бути константою або змінною, а також указувати на константу або змінну. Розглянемо приклади:

 

int i: // ціла змінна

const int ci = 1; // ціла константа

int * pi: // покажчик на цілу змінну

const int * pci; // покажчик на цілу константу

int * const cp = &i; // покажчик-константа на цілу змінну

const int * const cpc = &ci; // покажчик-константа на цілу константу

 

Як видно з прикладів, модифікатор const, що знаходиться між ім'ям указу теля і зірочкою, відноситься до самого покажчика і забороняє його зміну а const зліва від зірочки задає постійність значення, на яке він указує. Для ініціалізації покажчиків використана операція отримання адреси &. Величини типу покажчик підкоряються загальним правилам визначення області дії, видимості і часу життя.