Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод_лб_ пз_Інформатика.doc
Скачиваний:
15
Добавлен:
13.04.2015
Размер:
842.24 Кб
Скачать

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 — це ім'я масиву, що

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