Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Основні операції з покажчиками

Найбільш важливі операції з покажчиками: операція звертання за адресою " * " (називається також разіменуванням покажчика або разадресацією, або операцією непрямої адресації) і операція визначення адреси " & ". Операція звертання за адресою служить для доступу до даних описаного типу із застосуванням їх фізичної адреси, тобто для присвоєння і зчитування даних.

Приклад

int*x; //Оголошення покажчика (не плутати з разадресацію)

int d = 4;

x = &d; //Покажчик містить адресу перемінної d

int у = *х; //Разадресація покажчика х, у = 4

У першому рядку приведене оголошення покажчика х, а у другому - оголошення перемінної d. У третьому рядку перемінній-покажчику х привласнюється адреса, де зберігається значення перемінної d, у четвертому рядку перемінній у привласнюється разіменоване значення покажчика х, тобто значення 4. Якщо першу операцію з покажчиком написати без адреси, тобто х =d х оголошений як int*x), то х буде вказувати на комірку пам'яті з адресою ??:4 (?? - у залежності від моделі пам'яті), і значення перемінної y буде дорівнювати значенню, що зберігається за зазначеною адресою.

Таким чином операція визначення адреси “ & “ повертає адресу пам'яті свого операнда (перемінної, константи, функції і т.д.).

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

Адреса = & Перемінна

Крім того, покажчики можна привласнювати один одному, якщо вони одного типу.

Приклад

int a = 6, *y; y = &a; //Покажчик y містить адресу a

int b, *x; x = y; b = *x; //Перемінна в = 6

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

Покажчики і цілі величини

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

Ім’я масиву має тип покажчика на тип елементів масиву і вміщує адресу першого елементу масиву. Покажчик може адресувати масив символів. Ініціалізація масиву символів може виконуватись рядком символів. В цьому випадку в кінці масиву автоматично розташовується символ “ \0”.

Приклад

сhar *a = "Slovo", c; //Ініціалізація покажчика рядком символів

c = *(a+3); // c = 'v'

char *d, *b = "ABCDE";

d = b + 4;

c = *(- - d);

char k = *d;

int r = *(d - b);

Динамічне розміщення покажчиків у пам'яті

Щоб не викликати конфлікт в операційній системі чи не порушити роботу програми, потрібно виділяти місце для зазначеного типу даних у допустимому просторі пам'яті, що називається «heap» або «купа».

Виділення (якщо є можливість) пам'яті і присвоєння її адреси покажчику, за допомогою якого можна працювати з описаним типом, здійснюється бібліотечною функцією malloc ( ) або alloc( ) (заголовочний файл <mem.h>), яку необхідно попередньо включити в програму директивою # include. Ці функції при наступних виділеннях пам'яті запобігають конфліктам між покажчиками. Оголошення та формат використання функції malloc ( ) має вигляд

void * malloc ( size_t size );

Покажчик = (Тип_покажчика *) malloc ( Розмір_

виділеної_пам'яті_байт )

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

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