4. Передача параметрів у функцію
У мові C/C++ є три способи передачі параметрів у функцію.
Перший спосіб – це передача параметрів за значенням. Якщо в деяку функцію треба передавати параметр через значення, то формат заголовка функції має бути наступним:
<тип> <ім'я> ( <тип> <ім'я>)
Наприклад, хай функція має заголовок void f_1(int x). В цьому випадку передача параметра в тіло даної функції відбуватиметься за значенням, а саме: інформація з пам'яті викликаючою програми пересилається (переписується, копіюється) в пам'ять функції. Цей спосіб передачі параметрів схемнио демонструється на мал.1, де A – адреса області пам'яті, програми, що знаходиться під контролем, з якої функція викликається; B – адреса області пам'яті під контролем функції, що викликається. При такому способі передачі треба мати на увазі, що функція, що викликається, не може змінити інформацію в області пам'яті A.
А В
Х
Х
Число х із А засилається в В
Мал.1
Програма fun_6. Передача параметра у функцію за значенням.
void f_1(int x);
void main()
{ int y = 2;
cout << “Значення змінної до виклику функції y = ” << y
<< “\n”; f_1(y);
cout << “Вийшли з функції. \n\n”;
cout << “Значення змінної після виклику функції y = “ << y
<< “\n”;
}
void f_1(int x)
{ cout << “Виконується функція. \n\n”;
cout << “У функцію передана змінна x = “ << x << “\n”;
x = 10;
cout << “Після перетворення змінної у функції x = “ << x << “\n”; }
Функція f_1() змінною x привласнює значення 10. При цьому в головній програмі значення в змінній в не міняється. Результат роботи даної програми буде наступний:
Значення змінної до виклику функції y = 2;
Виконується функція
У функцію передана змінна x = 2;
Після перетворення змінної у функції x = 10;
Вийшли з функції
Значення змінної після виклику функції y = 2;
З трасування програми видно, що хоча значення локального параметра x в тілі функції змінилося, значення параметра у в головній програмі залишилося без зміни.
Другий спосіб передачі параметрів полягає в тому, що у функцію передається не аргумент, а значення адреси цього аргументу. Загальний формат заголовка функції в цьому випадку має бути наступним:
<тип> <ім'я> ( <тип> *<ім'я>)
Наприклад, хай функція має заголовок void f_1(int *x). Локальним параметром у функції в цьому випадку є покажчик, в який із зухвалої програми пересилається адреса змінної. Даний спосіб передачі параметра в тіло функції називається передачею параметра по покажчику. Він дозволяє з функції змінювати інформацію в пам'яті зухвалої програми. Схема передачі параметра по покажчику представлена на мал. 2.
А В
Х
А
Адреса А засилається у вказівник В
Мал.2
Програма fun_7. Передача параметра по покажчику.
void f_1(int *x);
void main()
{
int y = 2;
cout << “Адреса змінної y = ” << &y << “\n”;
cout << “Значення змінної y до виклику функції y = ” << y << “\n”;
f_1( &y); // У функцію пересилаємо адресу змінної y.
cout << “Вийшли з функції. \n\n”;
cout << “Значення змінної y після виклику функції y = ” << y << “\n”;
}
void f_1(int *x) // x – змінна для адреси.
{
cout << “Виконується функція. \n\n”;
cout << “В покажчик x передана адреса змінної в. x = ” << x << “\n”;
// Виводиться число з адреси, яка міститься в x.
cout << “В цій адресі число = “ << *x << “\n”;
*x=10; // Число 10 засилає в адресу, яка
// міститься в x.
cout << “Після перетворення змінної у функції x = “ << x << “\n”;
}
Функція f_1() змінною, адреса якої записана в покажчику x, привласнює значення 10. Оскільки при виклику функції f_1() з головної програми в покажчик x пересилається адреса змінної y, то тим самим значення 10 привласнюється y з головної програми. Результат роботи даної програми буде наступний.
Адреса змінної y = Ny
Значення змінної y до виклику функції y = 2
Виконується функція
У покажчик x передана адреса змінної в. x = Ny
У цій адресі число = 2;
Після перетворення змінної у функції x = 10;
Вийшли з функції
Значення змінної y після виклику функції y = 10
Відмітимо, що після виклику функції значення змінної у в головній програмі змінилося. Крім того, адреса Ny змінної y збігається із значенням адреси в покажчику x, який є локальним параметром для функції void f_1().
Третій спосіб передачі параметрів – передача параметра по засланню. Загальний формат заголовка функції в цьому випадку має бути наступним:
<тип> <ім'я> ( <тип> &< ім'я >)
Наприклад, якщо функція має заголовок void f_1(int &x), то в цьому випадку функція працює із змінними із зухвалої програми.
Програма fun_8. Передача параметра по посиланню.
void f_1(int &x);
void main()
{ int y = 2;
cout << “Значення змінної до виклику функції y = ” << y << “\n”;
f_1(y);
cout << “Вийшли з функції.\n\n”;
cout << “Значення змінної y після виклику функції y = ” << y << “\n”;
}
void f_1(int &x)
{
cout << “Виконується функція.\n\n”;
cout << “У функцію передано значення ”<< “x= “ << x << “\n”;
x = 10;
cout << “Після перетворення змінної у функції x = “ << x << “\n”;
}
Результат роботи даної програми буде наступний.
Значення змінної до виклику функції y = 2;
Виконується функція
У функцію передано значення x = 2;
Після перетворення змінної у функції x = 10;
Вийшли з функції
Значення змінної після виклику функції y = 10;