Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Так як показник містить адреси об'єкта, це дає можливість "непрямого" доступу до цьому об'єкту через покажчик. Припустимо, що х - перемінна, наприклад, типу 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.Робота з покажчиками як параметрами функцій

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

Покажчики як аргументи звичайно використовуються у функціях, що повинні повертати більш одного значення. (Можна сказати, що swap повертає два значення, нові значення її аргументів). Як приклад розглянемо функцію getint, що здійснює перетворення даних, що надходять у вільному форматі, розділяючи потік символів на цілі значення, по одному цілому за одне звертання.

Функція getint повинна повертати або знайдене значення, або ознака кінця файлу, якщо вхідні дані цілком вичерпані. Ці значення повинні повертатися як окремі об'єкти, яке б значення ні використовувалося для EOF, навіть якщо це значення цілого, що вводиться.
Наступний цикл заповнює масив цілими за допомогою звертань до функції getint:

int n, v, array[size];

for (n = 0; n < size && getint(&v)!= EOF; n++)

array[n] = v;

У результаті кожного звертання v стає рівним наступному цілому значенню, знайденому у вхідних даних. Зверніть увагу, що як аргумент getint необхідно вказати &v а не v. Використання просте v швидше за все приведе до помилки адресації, оскільки getint думає, що вона працює саме з покажчиком.

Сама getint є очевидною модифікацією написаної нами раніше функції atoi:

getint(pn) /* get next integer from input */

int *pn;

{

int c,sign;

while ((c = getch()) == ' ' || c == '\n'

|| c == '\t'); /* skip white space */

sign = 1;

if (c == '+' || c == '-') { /* record sign */

sign = (c == '+')? 1: -1;

c = getch();

}

for (*pn = 0; c >= '0' && c <= '9'; c = getch())

*pn = 10 * *pn + c - '0';

*pn *= sign;

if (c!= EOF)

ungetch(c);

return(c);

}

Вираз *pn використовується всюди в getint як звичайна змінна типу int. Ми також використовували функції getch і ungetch, так що один зайвий символ, який приходиться зчитувати, може бути поміщений назад у введення.

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

1. В якому випадку покажчики використовуться як аргументи функцій?

2. Що таке аргумент функції?

3.Як здійснється робота з покажчиками, які передаться як параметри функції?

Література:

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

Урок №32

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

 

Тема: Покажчики як результати роботи функції, покажчики на функції

Питання:

1.Використання вказівників

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

Використання вказівників

Вказівники - це змінні, що використовуються для збереження адреси. Унарна операція & повертає адресу, по якій зберігається змінна. Якщо х - це змінна, то &х - її адреса. Адресу можна представити у вигляді комірки пам'яті. У персональному комп'ютері адреси представляються у шістнадцятирічному вигляді. Наприклад:

printf("%d %p \n", pooh, &pooh); Оголошення вказівників

int * pi;

char * рс;

float *pf, *pq;

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

Існує п'ять основних операцій, що можна виконувати по відношенню до змінних вказівників:

1. присвоювання - вказівнику можна присвоїти адресу, завдяки оператору &;

2. Знаходження значення. Оператор * видає значення, що зберігається у вказаній комірці;

3. отримання адреси вказівника;

4. збільшення вказівника на 1. Збільшення вказівника на значення елементу масиву заставляє його зміститися до наступного елементу масиву. Наприклад, ptr++ збільшує числове значення ptraa чотири (чотири байта для значень типу int) і призводить до того, що він вказує на елемент масиву

5. Віднімання. Можливо обчислювати різницю між двома вказівниками. Звичайно, ця операція використовується для двох вказівників на елементи одного й того самого масиву для виявлення відстані між елементам

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

1. Що таке вказівник?

2. Де можна застосувати вказівники?

3. Які є операції з вказівниками?

Література:

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

Урок №35

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

Тема: Використання покажчиків

Питання:

1.Використання вказівників в програмі



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 235; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.148.180 (0.007 с.)