Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
31.01.2021
Размер:
18.71 Кб
Скачать

Інформатика — Теорія — Передача параметрів    Автори

|

Контакти

|

Підсистема допомоги

|

Методичні вказівки

|

Анотація

|

Назад

   ІнформатикаФункції : Передача параметрів Зміст курсу

Вступ

Теорія

Визначення й виклик функцій

Передача параметрів

Функції, що не повертають значення

Функції із змінним числом параметрів

Рекурсивні функції

Перевантаження функцій

Передача параметрів за замовчуванням

Масиви як параметри функцій

Шаблони функцій

Практика

Практичне заняття

Лабораторна робота

Поточна перевірка знань

Функції

Висновки

Версія для друку

  Передача параметрів Приклад 1. Неправильне використання параметрів.

void change (int x, int y)

{

     int k=x;

     x=y;

     y=k;

}

     У даній функції значення змінних x і y, що є формальними параметрами, міняються місцями, але оскільки ці змінні існують тільки усередині функції change, значення фактичних параметрів, використовуваних при виклику функції, залишаться незмінними. Для того, щоб мінялися місцями значення фактичних аргументів, можна використовувати функцію, наведену в наступному прикладі.

Приклад 2. Правильне використання параметрів.

void change (int *x, int *y)

{

     int k=*x;

     *x=*y;

     *y=k;

}

     При виклику такої функції як фактичні параметри повинні бути використані не значення змінних, а їхні адреси change (&a,&b);.

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

Приклад 3.

void fun ( int p)

{

     ++ p;

     cout << " p=" << p << endl;

}

void main ( )

{

     int x = 10;

     fun (x); // виклик функції

     cout << "x=" << x << endl;

}

     У результаті роботи цього фрагмента програми буде виведено: р=11, х = 10, оскільки для виклику функції fun(x) у неї передається копія значення, рівного 10, при виконанні цієї функції усередині її значення збільшується на 1, тобто (++р) і, тому виводиться р = 11, але за межами функції зазначене значення не змінюється.

     Параметром функції може бути посилання. Створення посилання схоже на створення звичайної змінної - тип, ім'я, ініціалізуючий вираз. Але праворуч від типу треба поставити символ &, і обов'язково явно ініціалізувати посилання - зв'язати з тим об'єктом, на який воно повинно посилатися.

int i;      // ціла зміннаint& ref = i;

     Після цього можна користуватися посиланням ref так само, як самою змінною i при цьому буде звертання не до посилання, а до самій змінній:

i = 8; // "прямій" доступ до iref = 8; // та ж дія, але доступ до i через посилання

     Іноді говорять навіть, що, створюючи посилання, створюється ще одне ім'я для наявної змінної.

     Навіть із наведеного приклада ясно, що створювати й використовувати посилання не складніше, ніж звичайні змінні. Однак при роботі з посиланнями завжди треба тримати в розумі дві речі:

     Посилання ніколи не може існувати само по собі - воно обов'язково пов'язано з якою-небудь змінною. У нього навіть немає своєї адреси - якщо ви спробуєте взяти адресу посилання, то одержите адресу пов'язаної з нею змінної.

     Усе, що ви можете зробити із самим посиланням - це створити її. Після створення ви вплинути на її подальшу долю ніяк не зможете, оскільки працювати будете не з посиланням, а з самою змінною. Посилання не можна знищити, воно може "вмерти" тільки своєю смертю, наприклад, коли програма вийде з локального блоку, де посилання оголошене. Не вдасться й перенаправляти її на іншу змінну. І так далі.

     А тепер подивимося, як виглядає робота з посиланнями у функціях.

Приклад 4. Використання параметра - посилання.

void fun (int &р)

{

     ++p;

     cout << "p = " << р << endl;

}

void main ( )

{

     int x = 10;

     fun( x );

     cout << "x=" << x << endl;

}

У результаті буде виведена інформація: р=11 і х=11.

Приклад 5. Функція, що міняє значення двох аргументів за допомогою посилання.

void swap(int& a, int& b)

{     int temp = a;     a = b;     b = temp;}

void main ( )

{      int i = 1, j = 2;

     swap(i,j); // тепер i==2 та j==1

}

Приклад 6. При використання аргументу-покажчика.

void fun2 (int *p)

{

     ++*р;

     cout << "*p = " << *p << endl;

}

void main ( )

{

     int x = 10;

     fun2 ( &x );

     cout << "x = " << x << endl;

}

У цьому випадку одержуємо той же результат, тобто р = 11 і х = 11.

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

     При передачі параметрів за значенням у функції утворюється локальна копія, що приводить до збільшення об'єму необхідної пам'яті. При виклику функції стек відводить пам'ять для локальних копій параметрів, а при виході з функції ця пам'ять звільняється. Цей спосіб використання пам'яті не тільки потребує додаткового її об'єму, але й віднімає додатковий час для зчитування. Наступний приклад демонструє, що при активізації (виклику) функції копії створюються для параметрів, що передаються за значенням, а для параметрів, що передаються за допомогою покажчиків, цього не відбувається. У функції два параметри - one, two - передаються за значенням, three - передається за допомогою покажчика. Так як третім параметром є покажчик на тип int, то він, як і всі параметри подібного типу, передаватиметься за вказівником.

Приклад 7. Передача параметрів в функцію.#include <iostream.h> void test(int one, int two, int * three) {     cout<< "\nАдреса one дорівнює "<<&one;     cout<< "\nАдреса two дорівнює "<<&two;     cout<< "\nАдреса three дорівнює "<<&three;     *three+=1;}main() {     int a1,b1;     int c1=42;     cout<< "\nАдреса a1 дорівнює "<< &a1;     cout<< "\nАдреса b1 дорівнює "<< &b1;     cout<< "\nАдреса c1 дорівнює "<< &c1;     test(a1,b1,&c1);     cout<<"\nЗначення c1 = "<<c1;}

На виході ми отримуємо наступне.Адреса а1 дорівнює FEC6Адреса b1 дорівнює FEC8Адреса c1 дорівнює FECAАдреса one дорівнює FEC6Адреса two дорівнює FEC8Адреса three дорівнює FECAЗначення c1 = 43     Після того, як змінна *three в тілі функції test збільшується на одиницю, нове значення буде присвоєно змінній c1, пам'ять під яку відводиться у функції main().

 © 2008 ХНУРЭ, Інформатики, Сінельнікова Т.Ф., informatika@kture.Kharkov.uaРозроблено за допомогою LERSUS

Соседние файлы в папке content