Здавалка
Главная | Обратная связь

Покажчики та посилання



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

покажчик елемент даних

адреса·

Формат задання адреси:

базис сегмента : зсув,

де базис сегмента – 16-ве число, що визначає адресу початку сегмента ОП (номер 16-байтового блоку, з якого починається сегмент; кратний 16);

зсув – 16-ве число, що визначає зміщення потрібного байта пам'яті відносно початку сегмента.

Наприклад, 000А:001А.

Такий спосіб запису адреси пов'язаний з тим, що в операційній системі DOS вся пам'ять розбита на сегменти, розміри яких не перевищують 64 Кбайт. Для отримання абсолютної адреси система додає до базису сегмента справа шістнадцятковий нуль (це чотири нулі в двійковій системі), а потім складає його зі зміщенням. Таким способом можна адресувати 1 Мбайт пам'яті.

Для зберігання значення покажчика (адреси) необхідно 4 байти ОП: 2 байти – для базису сегмента, 2 байти – для значення зсуву.

У мові С/С++ формат оголошення покажчиків має наступний вигляд:

базовий тип *покажчик;

Наприклад,

int *p, number;

float *ptr, *r;

¨¨¨ Кожен покажчик повинен бути оголошений своїм символом *.

Ініціалізація покажчиків у С/С++ здійснюється з використанням операції отримання адреси & при визначенні покажчика або за допомогою оператора присвоєння. Наприклад,

int n; int *nPtr = &n; n = 7; int n, *nPtr; n = 7; nPtr = &n;

 

Покажчик може отримати в якості початкового значення також пусте посилання null. Макрос null, що є константним нуль-покажчиком, визначений в заголовочних файлах stdlib.h, stddef.h та ін.

Звертання до відповідного значення здійснюється по формату:

*покажчик.

Наприклад,

int n, *p;

n = 7;

*p = 9;

cout << “n: “ << n << endl;

cout << “*p: “ << *p << endl;

Дії над покажчиками. Над покажчиками не визначені які-небудь операції, які б давали результат цього ж типу. І це зрозуміло — адже значеннями покажчиків є адреси тих або інших програмних об'єктів в пам'яті комп’ютера. А оскільки мова програмування високого рівня не містить яких-небудь правил щодо розміщення таких об'єктів в пам'яті комп’ютера (це питання вирішується самим транслятором), то неможливо сформулювати які-небудь розумні правила (операції), за допомогою яких в програмі можна було б визначити адресу одного об'єкту за адресами інших об'єктів.

Тому над покажчиками визначені лише операція присвоєння і деякі операції порівняння.

Для присвоєння значення покажчику використовується оператор присвоєння наступного формату:

покажчик := посилальний вираз;

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

- покажчик;

- функція, значенням якої є покажчик;

- порожній покажчик (nil, null).

Над покажчиками визначено дві операції порівняння: = (дорівнює) і ≠ (не дорівнює). Оскільки машинні адреси по суті справи є цілими числами, то над покажчиками можна було б визначити і інші операції порівняння (<, £, >, ³), але у цьому немає необхідності, оскільки при формулюванні алгоритму нема сенсу використовувати інформацію про те, який з двох програмних об'єктів розташований ближче до початку (кінця) пам'яті, а який далі.

Два покажчика вважаються рівними, якщо вони обидва є порожніми посиланнями або вказують на один і той же об'єкт — у всіх останніх випадках має місце нерівність покажчиків.

У мові С/С++ можна виводити адреси комірок пам’яті. Відповідні значення виводяться у 16-му вигляді. Наприклад,

#include <iostream.h>

main( )

{ int n, *nPtr;

n = 7;

nPtr = &n;

cout<<“Адреса n:“<<&n<<endl<<“Значення nPtr:“<<nPtr<<endl;

cout<<“Значення n:“<<&n<<endl<<“Значення *nPtr:“<<*nPtr<<endl;

}

Посилання. Посилання – це псевдонім (інше ім’я) змінної. Для нього не резервується місце в ОП. Формат оголошення псевдоніма:

базовий тип &псевдонім.

Кожен псевдонім повинен бути оголошений своїм символом &.

Посилання повинно бути ініціалізоване при його оголошенні. Наприклад,

int n = 5;

int &p = n, x = 3, &y = x;

Як тільки посилання оголошується як псевдонім іншої змінної, всі операції, що виконуються із посиланням, насправді виконуються із самою змінною.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.