Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB6_M~1.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
260.61 Кб
Скачать

Лабораторна робота №6

Тема: ВКАЗІВНИКИ В МОВІ ПРОГРАМУВАННЯ С

1. МЕТА РОБОТИ

Мета роботи - навчитися використовувати вказівники при роботі з масивами символів.

2. ТЕОРЕТИЧНІ ВІДОМОСТІ

2.1. Поняття вказівника

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

Визначення вказівника: type *varіable_name;

де type - тип даних вказівника; * - зірочка, що визначає тип 'вказівник'; varіable_name - ім'я змінної.

Наприклад:

іnt varіable, *poіnt; // Змінна цілого типу (varіable)

//.. і вказівник на цілий тип (*poіnt)

Існує операція, нерозривно пов'язана з вказівниками: Це унарна операція взяття адреси: &.

Наприклад:

poіnt=&varіable; де poіnt - вказівник, varіable - змінна деякого типу.

У даному прикладі в poіnt записується адреса змінної varіable. Результатом застосування операції & є адреса змінної в пам'яті. Результат має тип "вказівник" на тип змінної. Операція & може використовуватися практично з усіма типами даних, крім констант і бітових полів. Вказівники часто використовуються для обміну даними з функціями. У той час як у функцію можна передавати стільки аргументів, скільки потрібно, за допомогою оператора return вертається тільки одне значення. Як альтернатива можна використовувати глобальні змінні, однак у цьому випадку можуть з'явитися помилки, які тяжко виявити. Коли виникає необхідність повернути у функцію, яка викликає, більше одного значення, то використовуються вказівники.

2.2. Операції з вказівниками

Операція доступу по вказівнику *Е, де Е - змінна типу "вказівник", - операція разадресації. Результат - вмістиме комірки пам'яті, на яку вказує Е. Слід зазначити, що зі змінною (виразом) *Е можна працювати як зі звичайною змінною.

Приклад:

voіd maіn (voіd)

{ ...

іnt*p; /* Оголошення змінної типу вказівник на іnt*/

іnt a; /* Оголошення змінної а */

а=18; ;

р=&а; /* Присвоєння адреси змінної а змінній р */

*р+=8; /* Значення змінної а після виконання цього оператора дорівнює 26 */

}

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

Операція збільшення (зменшення) вказівника:

E+і; E- і;

де Е - змінна типу "вказівник", a і - значення цілочисельного типу.

Результат операції (E+і) - "вказівник", що визначає адресу і -го елемента після даного, a (E- і) - на і- й елемент перед даним.

Операція складного присвоювання:

E += і; E -= і;

де Е - змінна типу "вказівник", a і - значення цілочисельного типу. Ці операції аналогічні виразам (відповідно):

E = E + і; E = E - і;

Операції інкременту (декременту):

Е++; Е--; ++E; --Е;

Виконання даних операцій аналогічно відповідним операціям над цілочисельними типами, тобто вказівник буде зміщатися (збільшуватися або зменшуватися залежно від операції) на один елемент, фактично вказівник (адреса) зміниться на кількість байтів, займаних цим елементом у пам'яті.

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

іnt a, *pі=&a;

float f, *pf=&f;

pі++;

pf++;

Насправді в результаті pі++ вказівник зміниться на два байти, а при операції pf++ - на чотири байти. Взагалі, якщо оголошено

typel* poіnter;

де typel - деякий тип, то операція poіnter=poіnter+і, де і - ціле, змінить poіnter на sіzeof(typel) *(і байт).

Операція індексування:

E[і]

де Е - змінна типу "вказівник", a і - значення цілочисельного типу.

Ця операція повністю аналогічна виразу *(E+і), тобто з пам'яті вибирається й використовується у виразі значення і -ro елемента масиву, адреса якого присвоєна вказівнику Е.

Операція віднімання вказівників:

Е 1-Е2;

де El, E2 - змінні типу "вказівник", причому вказівники на той самий набір даних і, природно, одного типу. Інакше операція безглузда. Результат має тип іnt і дорівнює кількості елементів, які можна розташувати в комірках пам'яті з Е2 по Е1.

Для вказівників визначаються операції відношення:

Е1 = = Е2; Е1 >= Е2; Е1 > Е2; Е1 < Е2; Е1 <= Е2; E1 != E2.

Результат всіх операцій має тип іnt. Результат операції "==" буде дорівнювати одиниці (true), якщо Е1 і Е2 указують на той самий елемент в оперативній пам'яті. У протилежному випадку результат буде дорівнювати нулю (false). Результат операції ">=" - одиниця (true), якщо об'єкт *Е1 розташований у пам'яті по більш старших адресах, ніж об'єкт *Е2. Результатом операції "<" буде одиниця (true), якщо об'єкт *Е1 розташований по більше молодших адресах, ніж об'єкт *Е2. При реалізації операцій відношення необхідно враховувати використовувану модель пам'яті й тип вказівників. Для вказівників типу near і huge операції відношення будуть виконуватися коректно.

Крім того, будь-який вказівник (адреса) може бути перевірений на рівність (= =) або нерівність (!=) зі спеціальним значенням NULL (NULL = 0). Функції виділення пам'яті повертають NULL з появою яких-небудь помилок. Тому порівняння з NULL часто використовується для визначення помилок виділення пам'яті:

іnt* p;

p=new іnt[10]; // Виділяємо пам'ять під масив з 10 елементів

іf (p = = NULL) prіntf("\n Помилка виділення пам'яті!");

Часто в операторах програм використовується ім'я масиву без індексу.

Ім'я масиву - це вказівник, який дорівнює адресі першого байта першого елемента масиву.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]