Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

6.5.3. Багаторівнева непряма адресація

Можна створити покажчик, який посилатиметься на інший покажчик, а той – на кінцеве значення. Цю ситуацію називають багаторівневою непрямою адресацією (multiple indirection) або використанням покажчика на покажчик. Ідея багаторівневої непрямої адресації схематично проілюстрована на рис. 6.2. Як бачимо, значення звичайного покажчика (при однорівневій непрямій адресації) є адресою змінної, яка містить певне значення. У разі застосування покажчика на покажчик перший містить адресу другого, а той посилається на змінну, що містить певне значення.

Рис. 6.2. Однорівнева і багаторівнева непряма адресація

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

Змінну, яка є покажчиком на покажчик, потрібно оголосити відповідним чином. Для цього достатньо перед її іменем поставити додатковий символ "зірочка"(*). Наприклад, таке оголошення повідомляє компіляторові про те, що balance – це покажчик на покажчик на значення типу int:

int **balance;

Необхідно пам'ятати, що змінна balance тут – не покажчик на цілочисельне значення, а покажчик на покажчик на int-значення.

Щоб отримати доступ до значення, яка адресується покажчиком на покажчик, необхідно двічі застосувати оператор "*", як це показано в такому короткому прикладі.

Код програми 6.12. Демонстрація механізму використання багаторівневої непрямої адресації

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int x *p, **q;

x = 10;

p = &x;

q = &p;

cout << **q; // Виводимо значення змінної х.

getch(); return 0;

}

У цій програмі змінна р оголошена як покажчик на int-значення, а змінна q – як покажчик на покажчик на int-значення. У процесі виконання цієї програми ми набудемо значення змінної х, тобто число 10.

6.6. Виникнення проблем під час використання покажчиків

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

Труднощі виявлення помилок, пов'язаних з покажчиками, пояснюються тим, що сам по собі покажчик не виявляє проблему. Проблема може виявитися тільки опосередковано, можливо, навіть внаслідок виконання декількох настанов після "крамольної" операції з покажчиком. Наприклад, якщо один покажчик випадково отримає адресу "не тих" даних, то у процесі виконання операції з цим "сумнівним" покажчиком дані, що адресуються, можуть піддатися небажаній зміні, і, що тут найнеприємніше, то це те, що ця "таємна" зміна, як правило, проявляється набагато пізніше. Таке "запізнювання" істотно ускладнює пошук помилки, оскільки посилає Вас по "помилковому сліду". До того моменту, коли проблема стане очевидною, цілком можливо, що покажчик-винуватець зовні виглядатиме "нешкідливою овечкою", і Вам доведеться витратити ще немало часу, щоб знайти дійсну причину проблеми.

Оскільки для багатьох працювати з покажчиками – означає потенційно приректи себе на пошуки відповіді на запитання "Хто винен?", ми спробуємо розглянути можливі "яри" на шляху відважного програміста і показати деякі обхідні шляхи, що дають змогу уникнути виснажливих "мук творчості".