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

Інкремент і декремент

Операції ++ і -- виконуються аналогічно підсумовуванню (відніманню) одиниці до (з) вказівника.

Індексування

Операція індексування вказівника забезпечує доступ до об’єкта, який змі­щений у пам’яті на величину, що визначається значенням індексу. При цьому зсув у байтах дорівнює добутку значення індексу і розміру базового типу. Таким чином, якщо 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).