Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Программирование С++ / метод_лб_ пз_Інформатика.doc
Скачиваний:
5
Добавлен:
31.01.2021
Размер:
699.9 Кб
Скачать

2.3 Використання покажчиків

У мові С++ широко використовуються дані, що називаються покажчиками.

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

Загальний формат опису покажчика наступний:

тип * ім'я;

де тип — тип значень, на который буде вказувати покажчик;

ім'я — ім'я змінної-покажчика;

* — означає операцію над типом, що читається "покажчик" на тип.

Наведемо приклади визначень покажчиків:

int *pn; // покажчик на ціле значення;

float *pf1, *pf2 ; // два покажчики на дійсні значення;

Покажчики не прив'язують дані до якого-небудь визначеного імені змінної і можуть містити адреси будь-якого неіменованого значення. Існує адресна константа NULL , що означає "порожню" адресу.

У мові С++ знаходиться усього два оператори, що відносяться до покажчиків:

&” — оператор " адреса значення ";

* “ — оператор "значення за адресою".

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

Оператор "&" , використовуваний разом з покажчиками, повертає адресу змінної, розташованої безпосередньо після нього.

Покажчики можна оголосити одним з наступних способів:

<тип> *ptr;

<тип> *ptr = <перемінна - покажчик>;

<тип> *ptr =&<ім'я змінної>; // адреса змінної

У програмі це може виглядати в такий спосіб:

int *ptx ,b ; float y; // оголошені перемінна - покажчик ptx і звичайні змінні b і y;

float *sp = &y; // покажчику sp привласнюється адреса змінної y

float *p = sp; // покажчику p привласнюється значення (адреса значення),

// яке міститься в змінній sp, тобто адреса змінної y.

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

long *pt; long* Uk; int * ki, x, h ; // оголошення описів

У разі потреби опису покажчика на комірку довільного типу, замість ідентифікатора типу записується слово void, наприклад:

void *p, *pt; // описані два покажчики на довільний тип даних

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

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

int *p, *p1; // Оголошені два покажчики на комірку пам'яті int;

int x =12, y=5, m [7 ]; // Оголошені змінні x,y і масив m,

// змінні x,y ініціалізовані

p = &y; // Покажчику p привласнена адреса змінної y.

Тепер, якщо написати оператор виведення на екран у вигляді :

cout << "Адреса р " << p << "Значення по цій адресі= " <<*p; ,

тоді виведеться адреса комірки пам'яті, де записана змінна y і значення цієї змінної (тобто 5).

Використовуючи запис x = *p; , одержуємо x=5, тому що *p = y = 5; .

Змінити значення y можна таким чином:

y = 10; // чи *p = 10;

і виконавши операцію

*p= *p+5; // це рівнозначно операції y = y + 5; тобто y = 15.

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

int *pt = (char *) 0x00147; // Привласнюється адреса комірки

int *arrpt = new int [10]; // Визначається початкова адреса розміщення

// динамічного масиву

сhar *p = 0; // Ініціалізація нулем

Оскільки покажчики — це спеціальні змінні, то в операціях з іншим покажчиками вони можуть використовуватися без символу "*", тобто без розкриття посилання, наприклад:

float *pt1, *pt2 , x=15, m[5];

pt1=&x;

pt2=pt1;

pt1 = m; // або pt1 = &m[0]; m — це ім'я масиву, що

// розглядається як спеціальний покажчик – константа.