У мові С ++ широко використовуються дані, що називаються покажчиками.
Покажчики — це змінні, котрі містять адресу пам'яті, розподіленої для іншої змінної. Усі змінні, розглянуті до цього, зберігали якісь значення (дані). Ці дані могли бути різних типів: символьного, цілого, дійсного і т.д. При оголошенні змінної - покажчика необхідно вказати тип даних, адресу яких буде містити змінна, і ім'я покажчика з попередньою зірочкою.
Загальний формат опису покажчика наступний:
тип * ім'я;
де тип — тип значень, на который буде вказувати покажчик;
ім'я — ім'я змінної-покажчика;
* — означає операцію над типом, що читається "покажчик" на тип.
Наведемо приклади визначень покажчиків:
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 — це ім'я масиву, що
// розглядаєтьсяяк спеціальний покажчик – константа.
Наиведемо програму з використанням покажчиків:
// P2_5.CPP — застосування покажчиків
#include < iostream>
using namespace std;