Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostoyatelnye_po_S.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
672 Кб
Скачать
☆

Робота з непрямою адресацією

Так як показник містить адреси об'єкта, це дає можливість "непрямого" доступу до цьому об'єкту через покажчик. Припустимо, що х - перемінна, наприклад, типу int, а рх - покажчик, створений якимсь ще не зазначеним способом. Унарна операція & видає адресу об'єкта, так що оператор

рх = &х;

привласнює адреса х перемінної рх; говорять, що рх "указує" на х. Операція & застосовна тільки до перемінного й елементам масиву, конструкції виду &(х-1) і &3 є незаконними. Не можна також одержати адреса реєстрової перемінної. Унарна операція * розглядає свій операнд як адреса кінцевої мети і звертається по цій адресі, щоб витягти вміст. Отже, якщо y теж має тип int, те

y = *рх;

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

    рх = &х; y = *рх;

привласнює y те ж саме значення, що й оператор

y = x;

перемінні, що беруть участь у всім цьому необхідно описати:

int x, y;

int *px;

с описом для x і y ми вже неодонократно зустрічалися. Опис покажчика

int *px;

є новим і повинне розглядатися як мнемонічне; воно говорить, що комбінація *px має тип int. Це означає, що якщо px з'являється в контексті *px, те це еквівалентно перемінної типу int. Фактично синтаксис опису перемінної імітує синтаксис виражень, у яких ця перемінна може з'являтися. Це зауваження корисне у всіх випадках, зв'язаних зі складними описами. Наприклад,

double atof(), *dp;

говорить, що atof() і *dp мають у вираженнях значення типу double. Ви повинні також помітити, що з цього опису випливає, що покажчик може вказувати тільки на визначений вид об'ектов. Покажчики можуть входити у вираження. Наприклад, якщо px указує на ціле x, те *px може з'являтися в будь-якому контексті, де може зустрітися x. Так оператор

y = *px + 1

привласнює y значення, на 1 більше значення x;

printf("%d\n", *px)

друкує поточне значення x;

d = sqrt((double) *px)

одержує в d квадратний корінь з x, причому до передачі функції sqrt значення x перетвориться до типу double. (Дивися главу 2). У вираженнях виду

y = *px + 1

унарні операції * і & зв'язані зі своїм операндом більш міцно, чим арифметичні операції, так що таке вираження бере те значення, на яке вказує px, додає 1 і привласнює результат перемінної y. Ми незабаром повернемося до того, що може означати вираження

y = *(px + 1)

    Посилання на покажчики можуть з'являтися й у лівій частині присвоювань. Якщо px указує на x, то

*px = 0

думає x рівним нулеві, а

*px += 1

збільшує його на одиницю, як і вираження

(*px)++

круглі дужки в останньому прикладі необхідні; якщо них опустити, те оскільки унарні операції, подібні * і ++, виконуються праворуч ліворуч, це вираження збільшить px, а не ту перемінну, на яку він указує. І нарешті, тому що покажчики є перемінними, то з ними можна звертатися, як і з іншими перемінними. Якщо py - інший покажчик на перемінну типу int, то

py = px

копіює вміст px у py, у результаті чого py указує на те ж, що і px.

Оскільки в "C" передача аргументів функціям здійснюється "за значенням", викликана процедура не має безпосередньої можливості змінити перемінну з зухвалої програми. Що ж робити, якщо вам дійсно треба змінити аргумент? Наприклад, програма сортування захотіла б поміняти два елементи, які порушують порядок за допомогою функції з ім'ям swap. Для цього недостатньо написати

swap(a, b);

визначивши функцію swap при цьому в такий спосіб:

swap(x, y) /* wrong */

int x, y;

{

int temp;

temp = x;

x = y;

y = temp;

}

через виклик за значенням swap не може впливати на агументи a і b у функції, що викликається. Програма передає покажчики підлягаючій зміні значень:

swap(&a, &b);

тому що операція & видає адресу перемінної, те &a є покажчиком на a. У самої swap аргументи описуються як покажчики і доступ до фактичних операндам здійснюється через них.

swap(px, py) /* interchange *px and *py */

int *px, *py;

{

int temp;

temp = *px;

*px = *py;

*py = temp;

}

Питання для контролю:

1.Що таке покажчик?

2. Як за допомогою покажчика отримати адресу об’єкту ?

3.Як отримати об’єкт за допомогою покажчика?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 140-142

Урок №31

(згідно робочої навчальної програми)

Тема: Подвійні покажчики як параметри функції

Питання:

1.Робота з покажчиками як параметрами функцій

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