- •Елементи мови с.Основні символи
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Лексеми
- •Коментарі
- •Умовні оператори. Логічні вирази
- •Форми оператора if
- •Оператор вибору switch
- •Перерахування типів
- •Перетворення типів
- •Оператори циклу
- •Оператор while
- •Оператор for
- •Оператор do-while
- •Оператори переходу
- •Cтруктури
- •Об'єднання (суміші)
- •Робота з структурами.
- •Ініціалізація структур
- •Робота з обєднаннями
- •Визначення об'єктів та типів
- •Методи доступу до елементів масивів
- •Покажчики на багатовимірні масиви
- •Операції з вказівниками
- •Робота з покажчиками.
- •Покажчики на структуру
- •Масиви структур
- •Динамічне розміщення масивів
- •Робота з динамічними масивами
- •Робота з непрямою адресацією
- •Робота з покажчиками як параметрами функцій
- •Використання вказівників
- •Операції з вказівниками
- •Використання вказівників в програмі
- •Робота з файлами
- •Відкриття файлу
- •Обробка відкритого файлу
- •Перевірка ознаки кінця файлу
- •Закриття файлу
- •Функції введення-виведення
- •Робота з текстовими файлами
- •Функція форматованого виведення printf ()
- •Основні формати
- •Модифікації форматів
- •Функція форматованого введення scanf ()
- •Робота функції scanf ()
- •Призначеня функцій бібліотеки введення-виведення
- •Макрокоманди
- •Потокові інтерфейси введення-виведення
- •Ближні покажчики (near)
- •Дальні покажчики (far)
- •Покажчики huge
- •Функції для роботи з рядками
- •Динамічні рядки, клас string
- •Визначення поточної робочої директорії
- •Визначення поточного каталогу диска
- •Визначення / встановленн поточного диска
- •Пошук файлу
- •Створення, видалення, зміна директорій
- •Приклад програми для роботи з директоріями
- •Перегляд каталогу диска
- •Параметри структури ffblk
- •Робота з клавіатурою
- •Робота з файлами
- •Послідовний доступ до елементів двійкових файлів
- •Організація довільного доступу до елементів двійкових файлів
- •Робота динамічних структур даних.
- •Функції управління пам'яттю
- •Атрибути файлів.
- •Параметри
- •Динамічні структури даніх
- •Лінійні списки
- •Стек. Загальні поняття.
- •Приклад використання стеку
- •Основні визначення
- •Приклад використання дерев
Робота з непрямою адресацією
Так як показник містить адреси об'єкта, це дає можливість "непрямого" доступу до цьому об'єкту через покажчик. Припустимо, що х - перемінна, наприклад, типу 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.Робота з покажчиками як параметрами функцій
