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

6.2.3. Присвоєння значень за допомогою покажчиків

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

*p = 101;

число 101 присвоюється області пам'яті, в р, яка адресується покажчиком, Таким чином, цю настанову можна прочитати так: "за адресою р поміщаємо значення 101". Щоб інкрементувати або декрементувати значення, розташоване у області пам'яті, яка адресується покажчиком, можна використовувати настанову, подібну до такої:

(*p)++;

Круглі дужки тут є обов'язковими, оскільки оператор "*" має нижчий пріоритет, ніж оператор "++".

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

Код програми 6.3. Демонстрація механізму присвоєння значень з використанням покажчиків

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

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

int main()

{

int *p, num;

p = &num;

*p = 100;

cout << num << " ";

(*p)++;

cout << num << " ";

(*p)--;

cout << num << "\n";

getch(); return 0;

}

Ось такі результати генерує ця програма.

100 101 100

6.3. Використання покажчиків у виразах

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

6.3.1. Арифметичні операції над покажчиками

З покажчиками можна використовувати тільки чотири арифметичних оператори: ++; --; + і -. Щоб краще зрозуміти, що відбувається у процесі виконання арифметичних дій з покажчиками, почнемо з конкретного прикладу. Нехай р1 – покажчик на int-змінну з поточним значенням 2 000 (тобто р1 містить адресу 2 000). Після виконання (у 32-розрядному середовищі) виразу

p1++;

вміст змінної-покажчика р1 дорівнюватиме 2 004, а не 2 001! Йдеться про те, що під час кожного інкрементування покажчик р1 вказуватиме на наступне int-значення. Для операції декрементування справедливе зворотне твердження, тобто під час кожного декрементування значення р1 зменшуватиметься на 4. Наприклад, після виконання настанови

p1--;

покажчик р1 матиме значення 1 996, якщо до цього воно дорівнювало 2 000. Отже, кожного разу, коли покажчик інкрементується, він вказуватиме на область пам'яті, що містить наступний елемент базового типу цього покажчика. А під час кожного декрементування він вказуватиме на область пам'яті, що містить попередній елемент базового типу цього покажчика.

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

Арифметичні операції над покажчиками не обмежуються використанням операторів інкремента і декремента. Із значеннями покажчиків можна виконувати операції додавання і віднімання, використовуючи як другий операнд цілочисельні значення. Вираз

р1 = р1 + 9;

примушує р1 посилатися на дев'ятий елемент базового типу покажчика р1 щодо елемента, на який р1 посилався до виконання цієї настанови.

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

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

Щоб зрозуміти, як формується результат виконання арифметичних операцій над покажчиками, виконаємо таку коротку програму. Вона виводить реальні фізичні адреси, які містять покажчик на int-значення (izm) і покажчик на float-значення (f). Звернемо Вашу увагу на кожну зміну адреси (залежну від базового типу покажчика), яка відбувається під час повторення циклу1. Зверніть увагу також на те, що під час використання покажчика в cout-настанові його адреса автоматично відображається у форматі адресації, що вживається для поточного процесора і середовища виконання.

Код програми 6.4. Демонстрація виконання арифметичних операцій над покажчиками

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

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

int main()

{

int *izm, jzm[10];

double *f, g[10];

int x;

izm = jzm;

f = g;

for(x=0; x<10; x++)

cout << izm + x << " " << f + x << "\n";

getch(); return 0;

}

Ось як виглядають можливі варіанти виконання цієї програми1:

0012FE5C 0012FE84

0012FE60 0012FE8C

0012FE64 0012FE94

0012FE68 0012FE9C

0012FE6C 0012FEA4

0012FE70 0012FEAC

0012FE74 0012FEB4

0012FE78 0012FEBC

0012FE7C 0012FEC4

0012FE80 0012FECC

1245016 1244936

1245020 1244944

1245024 1244952

1245028 1244960

1245032 1244968

1245036 1244976

1245040 1244984

1245044 1244992

1245048 1245000

1245052 1245008

Необхідно пам'ятати! Всі арифметичні операції над покажчиками виконуються щодо базового типу покажчика.