Застосування Гайду безбар’єрності в роботі закладів культури громад Одещини.pdf
Лекція №12 Передача параметрів у функцію.pptx
1. Лекція № 12
Передача параметрів у функцію. .
1
Національний технічний університет
України «КИЇВСЬКИЙ ПОЛІТЕХНИЧНИЙ
ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО
Кафедра інформаційних систем та
технологій
Лектор
Проскура СвІтлана Леонідівна
slproskura@gmail.com
ПРОГРАМУВАННЯ-1. ОСНОВИ ПРОГРАМУВАННЯ
2. План
1. Області видимості. Локальна глобальна області
видимості.
2. Способи передачі параметрів у підпрограми, особливості
реалізації.
3. . Функції з аргументами за замовчуванням, особливості їх
реалізації у С/С++.
4. Використання вказівників та посилань при роботі з
функціями. Вказівники, як аргументи функцій. Програмний
стек
3. Вказівник Посилання
Об’явлення вказівника , наприклад int *p Для об’явлення посилання використовується оператор
посилання &.
Пам’ять під посилання в ОЗП не виділяється
Ініціалізація вказівника – а саме привласнити йому значення
адреси будь-якого об’єкта , наприклад:
int a = 10 ; p = & a ;
int *p = & a
При об’явленні посилання необхідно обов'язково задати
иніціалізуючий вираз, псевдонімом якого і буде посилання.
Int Count = 0; int& RefCount = Count;
Унарний оператор & видає адресу об'єкту, так що інструкція p =
& a ; привласнює адресу комірки змінної а вказівнику p
(говорять , що р посилається на а )
Оператор & застосовується тільки до об'єктів, розташованих в
пaмяті. Його операндом не може бути ні вираз, ні константа
Як тільки ця ініціалізація виконана, посилатися на інші змінні
вже не можна. Тобто після визначення посилання
завжди"дивиться" на ту ділянку пам'яті(на той об'єкт), з яким
вона зв'язана ініціалізацією.
Іншими словами, після визначення посилання не може бути
ніяким способом "відірвано" від об'єкта ініціалізації і пов'язано
з іншим об'єктом.
Розіменування вказівника – це унарний оператор * (непряма
адресація ). Розіменування дає можливість працювати з об’єктом
через вказівник.
Жодна з операційне дієна посилання, а відноситьсядо того
об'єкту, з яким вона зв'язана. Таким чином, посилання повністю
аналогічнt вихідного імені об'єкта.
Унарні оператори * і & мають вищий пріоритет, ніж арифметичні
оператори, так що зустрівши привласнення y=*p+1 компілятор
візьме те, на що указує р і додасть до нього 1, а результат
привласнить змінній у.
Аналогічно *p+=1 збільшує на одиницю те, на що посилається p;
ті ж дії виконують ++*p і (*p)++.
У останньому записі дужки необхідні, оскільки, якщо їх не буде,
збільшиться значення самого покажчика, а не те, на що він
посилається. Це обумовлено тим, що унарні оператори * та
Існують деякі обмеження використання операції посилання&,
зокрема запам'ятайте три "не можна":
1.Не можна виконувати посилання на посилання.
int a;
int&&ra=a;//помилка
2.Не можна створювати масив посилань.
int a;
int & ra [10];//помилка
3.Не можна створювати покажчик на посилання.
4. ❖Кожний ідентифікатор у програмі має свою область дії імені,
або область видимості.
❖Область видимості ідентифікатора — це область
програми, в межах якої на цей ідентифікатор можна
посилатися.
❖Послідовність і кількість блоків, у яких іменуються ті чи інші
об’єкти, можуть бути довільними.
❖Області дії ідентифікатора:
● вираз,
● блок,
● функція,
● файл,
● програма
❖У загальному випадку область дії іменування поширюється
від точки, де ідентифікатор було оголошено, до кінця блока.
❖Кінцем блока вважають праву фігурну дужку }
Локалізація імен
5. Усі ідентифікатори, оголошені всередині функції, є
локалізованими в ній, тобто ззовні підпрограми вони є
невидимими.
Окрім власних локальних імен усередині функції видимими є
також ідентифікатори верхнього рівня, тобто
ідентифікатори, оголошені поза будь-якою функцією.
Такі ідентифікатори називають глобальними
змінна
2
Функція1
функція2
змінн
а1
Локалізація імен
6. Різні об'єкти можна іменувати однаково, але в різних
програмних блоках.
В оголошеннях тієї самої підпрограми або програми усі
імена мають бути різними.
Локалізація імен
7. Клас пам’яті змінної визначає її область дії, час життя та
простір імен .
Час життя ідентифікатора — це період, протягом якого цей
ідентифікатор існує в оперативній пам’яті.
<клас пам’яті> <тип> <ім’я>;
Ідентифікатор може бути неодноразово створений та знищений, може існувати
протягом усього часу роботи програми, або в межах певного блока.
Визначено чотири класи пам’яті:
auto, register, extern, static.
Синтаксис оголошення класу пам’яті змінних:
Класи пам’яті
8. Специфікатор auto використовують для оголошення
змінних автоматичного класу пам’яті.
Змінні автоматичного класу пам’яті є змінними з локальним
часом життя.
До цього класу пам’яті належать локальні змінні та
параметри функцій.
Локальні змінні є змінними автоматичного класу пам’яті за
умовчанням, тому специфікатор аuto для них явно не
вказують.
Класи пам’яті
9. Специфікатор
register
застосовують
під час
оголошення
автоматичної
змінної, аби
вказати
компілятору на
необхідність
зберігання
змінної не в
оперативній
пам’яті, а в
регістрі
процесора.
Функції одного файлу можуть
звертатися до змінних, визначених
в інших файлах, якщо ці змінні
було оголошено з ключовим
словом extern, тобто якщо вони є
зовнішніми. Змінні створюються на
початку роботи програми,
зберігають свої значення
протягом її роботи і знищуються
лише після завершення роботи
програми. Специфікатор extern
повідомляє компілятор про те, що
відповідна змінна
оголошуватиметься в будьякому
місці програми.
Статичні змінні
записують із
ключовим
словом static.
На відміну від
автоматичної
статична
змінна не
створюється
автоматично і
не знищується
після виходу з
функції.
Класи пам’яті
10. Область оперативної пам'яті, що її використовує програма,
поділяється на:
● сегмент коду,
● сегмент даних
● сегмент стеку.
● В сегменті коду — зберігаються команди програми,
● в сегменті даних — значення глобальних змінних,
● в сегменті стеку — значення локальних змінних і параметрів
підпрограм.
Розподіл оперативної пам’яті
11. В С/C++ параметри поділяються на:
❖параметри-значення,
❖параметри-посилання,
❖параметри-покажчики
❖параметри-константи.
Різновиди параметрів
12. Різновиди параметрів
Передача параметрів
за значенням За адресою через вказівник За адресою через посилання
void square ( int x )
{
x = x * x;
}
void main ()
{
int a = 10 ;
square ( a );
cout << a;
}
void square ( int *x )
{
*x = *x * ( *x ) ;
}
void main (
{
int a = 10 ;
square ( &a ) ;
cout << a;
}
void square( int &x )
{
x = x * x ;
}
void main ( )
{
int a = 10 ;
square ( a ) ;
cout << a; //виведе 100
}
Cпособи передачі параметрів у функцію
13. Під час виклику підпрограми:
1. Обчислюється значення відповідного аргументу
2. Копія отриманого результату передається підпрограмі.
3. Зміна параметрів-значень усередині підпрограми не впливає
на значення змінних, що вказані як аргументи підпрограми,
оскільки змінюються їх копії.
4. Повернення з функції переданого значення не відбувається
Передача параметрів-значень
Сегмент коду Сегмент стеку
Сегмент даних
Копія
NameVariable
1234
NameVarible
14. Передача параметрів-змінних
1. До підпрограми передається покажчик на параметр, тобто
адреса певної змінної в сегменті даних оперативної пам'яті.
2. Підпрограма виконує дії над значеннями параметрів-
змінних, а не над їх копіями,
3. Модифікація параметра-змінної приводить до модифікації
змінної, що вказана як аргумент в операторі виклику
підпрограми.
4. Параметри-змінні використовуються у процедурах з метою
повернення отриманих під час виконання підпрограми значень
до точки її виклику.
Сегмент коду Сегмент стеку
Сегмент даних
1234
NameVarible
46С7:СЕ7Е
5678
Адреса
NameVariable
46С7:СЕ7Е
15. Передача параметрів-змінних
Параметри-значення оголошують як звичайні локальні змінні в
списку параметрів підпрограми.
Під час виклику підпрограми копія аргумента передається
підпрограмі.
Якщо параметр оголошено як параметр-посилання чи параметр-
покажчик, то підпрограмі передається адреса аргументу — змінної
в сегменті даних оперативної пам’яті.
Параметр-посилання оголошується через операцію адресації &.
Параметр-покажчик оголошується через операцію *
Підпрограма виконує дії над значеннями змінних, а не над їх
копіями, і модифікація параметра-посилання чи параметра-
покажчика приведе до модифікації змінної, що була вказана як
аргумент в операторі виклику підпрограми.
16. Передача параметрів-змінних
Якщо значення, що передаються у функцію, не повинні
змінюватися, навіть при виконанні дій над копією аргументу,
параметр оголошують із ключовим словом const.
Такий параметр називають параметр-константа.
Значення параметра-константи не можна змінювати в тілі
підпрограми.
1. Якщо оперативної пам’яті недостатньо і термін
виконання програми є важливим фактором, то слід
використовувати параметри-покажчики.
2. З метою захисту даних від випадкових змін слід
передавати параметри як параметри-значення.
Рекомендації
17. 1. Виконання основної програми починається після завантаження
її коду в оперативну пам'ять комп'ютера.
2. Змінні, які доступні з програми протягом усього часу її
виконання, називаються статичними.
3. Область пам'яті, що виділяється під програму та її змінні, також
називається статичною.
4. Із локальними іменами і параметрами-значеннями підпрограм,
як правило, зіставляються ділянки іншої області пам'яті –
автоматичної.
5. Під час виконання викликів підпрограм пам'ять виділяється та
звільняється автоматично, без явних вказівок у програмі.
6. Локальні змінні доступні тільки під час виконання відповідної
підпрограми.
Програмний стек
18. 7. Виділення та звільнення ділянок пам'яті під час виконання
викликів підпрограм відбувається за принципом «останнім
прийшов – першим пішов» (з англійської «Last In – First Out»
або скорочено LIFO).
Така структура називається стеком (stack).
Автоматична пам'ять, що виділяється для підпрограм,
називається програмним стеком.
Last In
Програмний стек
First Out