You are on page 1of 19

Національний технічний університет Кафедра інформаційних систем та

України «КИЇВСЬКИЙ ПОЛІТЕХНИЧНИЙ


технологій
ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО

ПРОГРАМУВАННЯ-1. ОСНОВИ ПРОГРАМУВАННЯ

Лекція № 12
Передача параметрів у функцію. .
Лектор
Проскура СвІтлана Леонідівна
slproskura@gmail.com

1
План
1. Області видимості. Локальна глобальна області
видимості.

2. Способи передачі параметрів у підпрограми, особливості


реалізації.

3. . Функції з аргументами за замовчуванням, особливості їх


реалізації у С/С++.

4. Використання вказівників та посилань при роботі з


функціями. Вказівники, як аргументи функцій. Програмний
стек
Вказівник Посилання
Об’явлення вказівника , наприклад 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, а результат
привласнить змінній у. 1.Не можна виконувати посилання на посилання.
int a;
int&&ra=a;//помилка
Аналогічно *p+=1 збільшує на одиницю те, на що посилається p;
ті ж дії виконують ++*p і (*p)++.
2.Не можна створювати масив посилань.
int a;
У останньому записі дужки необхідні, оскільки, якщо їх не буде, int & ra [10];//помилка
збільшиться значення самого покажчика, а не те, на що він
посилається. Це обумовлено тим, що унарні оператори * та +
+мають однакові пріоритет і порядок виконання - справа наліво. 3.Не можна створювати покажчик на посилання.
int a;
int & * pra = &a; //помилка
Будь-яку адресу можна перевірити на рівність (==) або
Локалізація імен
❖Кожний ідентифікатор у програмі має свою область дії імені,
або область видимості.
❖Область видимості ідентифікатора — це область
програми, в межах якої на цей ідентифікатор можна
посилатися.
❖Послідовність і кількість блоків, у яких іменуються ті чи інші
об’єкти, можуть бути довільними.
❖Області дії ідентифікатора:
● вираз,
● блок,
● функція,
● файл,
● програма
❖У загальному випадку область дії іменування поширюється
від точки, де ідентифікатор було оголошено, до кінця блока.
❖Кінцем блока вважають праву фігурну дужку }
Локалізація імен
Усі ідентифікатори, оголошені всередині функції, є
локалізованими в ній, тобто ззовні підпрограми вони є
невидимими.

Окрім власних локальних імен усередині функції видимими є


також ідентифікатори верхнього рівня, тобто
ідентифікатори, оголошені поза будь-якою функцією.
Такі ідентифікатори називають глобальними

змінна
2
Функція1
функція2
змінн
а1
Локалізація імен

Різні об'єкти можна іменувати однаково, але в різних


програмних блоках.
В оголошеннях тієї самої підпрограми або програми усі
імена мають бути різними.
Класи пам’яті
Клас пам’яті змінної визначає її область дії, час життя та
простір імен .
Час життя ідентифікатора — це період, протягом якого цей
ідентифікатор існує в оперативній пам’яті.

Ідентифікатор може бути неодноразово створений та знищений, може існувати


протягом усього часу роботи програми, або в межах певного блока.
Визначено чотири класи пам’яті:
auto, register, extern, static.

Синтаксис оголошення класу пам’яті змінних:

<клас пам’яті> <тип> <ім’я>;


Класи пам’яті
Специфікатор auto використовують для оголошення
змінних автоматичного класу пам’яті.
Змінні автоматичного класу пам’яті є змінними з локальним
часом життя.
До цього класу пам’яті належать локальні змінні та
параметри функцій.
Локальні змінні є змінними автоматичного класу пам’яті за
умовчанням, тому специфікатор аuto для них явно не
вказують.
Класи пам’яті

Специфікатор
register Функції одного файлу можуть Статичні змінні
застосовують звертатися до змінних, визначених записують із
під час в інших файлах, якщо ці змін­ні ключовим
оголошення було оголошено з ключовим словом static.
автоматичної словом extern, тобто якщо вони є На відміну від
змінної, аби зовнішні­ми. Змінні створюються на
авто­матичної
вказати початку роботи програми,
компілятору на зберігають свої зна­чення протягом
статична
необхідність її роботи і знищуються лише після змінна не
зберігання завершення роботи про­грами. створюється
змінної не в Специфікатор extern повідомляє автоматично і
оперативній компілятор про те, що відповідна не знищується
пам’яті, а в змінна оголошуватиметься в будь­ після виходу з
регістрі якому місці програми. функції.
процесора.
Розподіл оперативної пам’яті

Область оперативної пам'яті, що її використовує програма,


поділяється на:
● сегмент коду,
● сегмент даних
● сегмент стеку.

● В сегменті коду — зберігаються команди програми,


● в сегменті даних — значення глобальних змінних,
● в сегменті стеку — значення локальних змінних і параметрів
підпрограм.
Різновиди параметрів

В С/C++ параметри поділяються на:


❖параметри-значення,
❖параметри-посилання,
❖параметри-покажчики
❖параметри-константи.
Різновиди
Cпособи передачі параметрів
параметрів у функцію
Передача параметрів
за значенням За адресою через вказівник За адресою через посилання
void square ( int x ) void square ( int *x ) void square( int &x )
{ { {
x = x * x; *x = *x * ( *x ) ; x=x*x ;
} } }
void main (
void main () { void main ( )
{ int a = 10 ; {
int a = 10 ; square ( &a ) ; int a = 10 ;
square ( a ); cout << a; square ( a ) ;
cout << a; } cout << a; //виведе 100
} }
Передача параметрів-значень

Сегмент коду Сегмент даних Сегмент стеку

Копія
NameVarible 1234 NameVariable

Під час виклику підпрограми:


1. Обчислюється значення відповідного аргументу
2. Копія отриманого результату передається підпрограмі.
3. Зміна параметрів-значень усередині підпрограми не впливає
на значення змінних, що вказані як аргументи підпрограми,
оскільки змінюються їх копії.
4. Повернення з функції переданого значення не відбувається
Передача параметрів-змінних
Сегмент коду Сегмент даних Сегмент стеку

Адреса 46С7:СЕ7Е
NameVarible 1234
NameVariable 5678

46С7:СЕ7Е

1. До підпрограми передається покажчик на параметр, тобто


адреса певної змінної в сегменті даних оперативної пам'яті.
2. Підпрограма виконує дії над значеннями параметрів-
змінних, а не над їх копіями,
3. Модифікація параметра-змінної приводить до модифікації
змінної, що вказана як аргумент в операторі виклику
підпрограми.
4. Параметри-змінні використовуються у процедурах з метою
повернення отриманих під час виконання підпрограми значень
до точки її виклику.
Передача параметрів-змінних
Параметри-значення оголошують як звичайні локальні змінні в
списку параметрів підпрограми.
Під час виклику підпрограми копія аргумента передається
підпрограмі.

Якщо параметр оголошено як параметр-посилання чи параметр-


покажчик, то підпрограмі передається адреса аргументу — змінної
в сегменті даних оперативної пам’яті.

Параметр-посилання оголошується через операцію адресації &.


Параметр-покажчик оголошується через операцію *

Підпрограма виконує дії над значеннями змінних, а не над їх


копіями, і модифікація параметра-посилання чи параметра-
покажчика приведе до модифікації змінної, що була вказана як
аргумент в операторі виклику підпрограми.
Передача параметрів-змінних
Якщо значення, що передаються у функцію, не повинні
змінюватися, навіть при виконанні дій над копією аргументу,
параметр оголошують із ключовим словом const.
Такий параметр називають параметр-константа.
Значення параметра-константи не можна змінювати в тілі
підпрограми.
Рекомендації

1. Якщо оперативної пам’яті недостатньо і термін


виконання програми є важливим фактором, то слід
використовувати параметри-покажчики.
2. З метою захисту даних від випадкових змін слід
передавати параметри як параметри-значення.
Програмний стек
1. Виконання основної програми починається після завантаження
її коду в оперативну пам'ять комп'ютера.
2. Змінні, які доступні з програми протягом усього часу її
виконання, називаються статичними.
3. Область пам'яті, що виділяється під програму та її змінні, також
називається статичною.
4. Із локальними іменами і параметрами-значеннями підпрограм,
як правило, зіставляються ділянки іншої області пам'яті –
автоматичної.
5. Під час виконання викликів підпрограм пам'ять виділяється та
звільняється автоматично, без явних вказівок у програмі.
6. Локальні змінні доступні тільки під час виконання відповідної
підпрограми.
Програмний стек
7. Виділення та звільнення ділянок пам'яті під час виконання
викликів підпрограм відбувається за принципом «останнім
прийшов – першим пішов» (з англійської «Last In – First Out»
або скорочено LIFO).
Така структура називається стеком (stack).

Автоматична пам'ять, що виділяється для підпрограм,


називається програмним стеком.

Last In
First Out
Дякую за увагу!!!!

You might also like