
- •Методичні вказівки
- •1.Теоретичні основи
- •1.1.Загальні відомості про вказівники
- •1.2.Операції з вказівниками
- •Присвоювання
- •Розіменування
- •Отримання адреси
- •Підсумовування і віднімання
- •Інкремент і декремент
- •Індексування
- •1.3.Константи і вказівники
- •1.4.Вказівники і масиви
- •2.Приклади програм
- •3.Завдання на лабораторну роботу
- •4.Варіанти задач
- •5.Контрольні запитання
- •Список літератури
- •61002, Харків, вул. Фрунзе, 21.
- •61002, Харків, вул. Фрунзе, 21.
Інкремент і декремент
Операції ++ і -- виконуються аналогічно підсумовуванню (відніманню) одиниці до (з) вказівника.
Індексування
Операція індексування вказівника забезпечує доступ до об’єкта, який зміщений у пам’яті на величину, що визначається значенням індексу. При цьому зсув у байтах дорівнює добутку значення індексу і розміру базового типу. Таким чином, якщо i – деяке значення цілого типу, а P – вказівник з деяким базовим типом, то має місце співвідношення P[i] == *(P + i).
Звичайним образом над вказівниками виконуються всі операції порівняння. При цьому порівнювати можна тільки вказівники з тим самим базовим типом.
Операції new і delete розглядатимуться окремо.
За винятком операції присвоювання і операцій порівняння, ніякі дії над вказівниками з базовим типом void не визначені.
1.3.Константи і вказівники
Вказівник може бути оголошеним константою. У цьому разі після ініціалізації він завжди буде посилатися на ту саму ділянку пам’яті і змінити це посилання виявляється неможливим. Формат оголошення константного вказівника (вказівника-константи) такий:
тип * const ім’я_вказівника ініціалізатор;
Наприклад:
double e = 2.72; double pi = 3.14; double * const Pt_const = π
Надалі в програмі можливе будь-яке змінення змінної pi, але змінити значення змінної Pt_const не вдасться. Так, якщо за допомогою оператора
pi = 3.1415;
здійснити задавання для змінної pi більш точного значення, то значенням виразу *Pt_const також буде число 3.1415. У той же час оператор
*Pt_const = &e;
діагностуватиметься компілятором як помилковий.
Вказівник може посилатися на константу:
тип const *ім’я_вказівника ініціалізатор;
При такому визначенні можна змінювати значення вказівника, але неможливо за допомогою його розіменування виконати змінення вмісту ділянки пам’яті, на яку він посилається.
Так, синтаксично правильними є такі оператори:
const int ZERO=0, ONE=1; const int *p_to_const = &ZERO; p_to_const = &ONE; p_to_const = NULL;
Тут вказівник по черзі посилається на різні константи.
Однак оператор
*p_to_const = 7;
є синтаксично помилковим – він здійснює спробу змінити значення константи.
Можливе також використання константних вказівників на константу:
тип const * const ім’я_вказівника ініціалізатор;
Тут перше слово const указує на те, що константою є значення, записане за адресою, на яку посилається вказівник при його ініціалізації, а друге слово const забороняє змінення самого вказівника.
Звичайний вказівник може отримати адресу іменованої константи, але при цьому необхідно приведення типів:
const int ZERO=0; int * p_to_const = (int *) &ZERO;
1.4.Вказівники і масиви
Особливістю масивів є те, що ім’я масиву є константним вказівником, який адресує перший елемент. Особливістю імені масиву як вказівника є те, що до нього застосовні всі операції, які не приводять до змінення значення вказівника. Насамперед, мова йде про операцію індексування, яка при обробці вмісту масиву зустрічається частіш за все. Можна також додавати (віднімати) ціле значення до (з) імені масиву, отримуючи вказівник, що адресує елемент масиву з індексом, який визначається доданим (вирахуваним) числом Так, якщо A – масив з елементами будь якого типу, а k – ціле значення, то
A + k == A[k],
причому в разі від’ємного k здійснюватиметься звертання до неіснуючого в масиві елемента, а у випадку, коли k більше або дорівнює кількості елементів масиву матиме місце звертання до ділянки пам’яті за останнім елементом.
Операція & при її застосуванні до імені масиву дає адресу елемента з індексом 0 (але іншого типу). У той же час у будь-який вказівник можна записати «значення» імені масиву з тим самим базовим типом. Операції перетворення типу і порівняння, застосовані до імені масиву, виконуються за звичайними правилами, але при порівнянні повинне бути жорстке дотримання типів.
Особливе місце займає операція розміру об’єкта або типу sizeof(). Якщо її застосувати до імені статичного масиву, то результатом її виконання є обсяг пам’яті в байтах, яку фактично займає масив. Застосування ж цієї операції до будь-якого іншого вказівника дає розмір пам’яті, відведеної під вказівник (завжди 4).