Урок 10 зміна значень параметрів

Зміна значень параметрів

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

• Якщо функція не використовує покажчики або посилання, вона не може змінити значення параметра.

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

ЧОМУ ФУНКЦІЇ ЗВИЧАЙНО НЕ МОЖУТЬ ЗМІНИТИ ЗНАЧЕННЯ ПАРАМЕТРІВ

Наступна програма NOCHANGE.CPP передає два параметра з іменами big і small в функцію display_values. Функція display_values, в свою чергу, надає обом параметрам число 1001 і потім виводить значення кожного параметра. Коли функція завершується, програма відновлюється і виводить значення цих же параметрів:

void display_values ​​(int a, int b)

b = тисяча один;
cout <<"Значения в функции display_values равны " <<а <<" и " <>

Коли ви откомпіліруете і запустіть цю програму, на екрані з'явиться наступний висновок:

З: \> NOCHANGE

Значення в функції display_values ​​рівною 1001 # 9; і 1001

Як бачите, значення параметрів в функції display_values ​​були змінені (1 001). Однак після завершення функції значення змінних big і small в main залишилися колишніми. Щоб зрозуміти, чому зміна параметрів не вплинуло на змінні big і small в main, вам необхідно зрозуміти, як C ++ передає параметри в функції.

Коли ваші програми передають параметр у функцію, то за замовчуванням С ++ робить копію значення параметра і поміщає цю копію в тимчасовий ділянку пам'яті, званий стеком. Потім функція використовує копію значення для виконання своїх операцій. Коли функція завершується, C ++ скидає вміст стека і всі зміни, зроблені функцією в копіях еначеній параметра.

Як ви знаєте, змінна представляє собою ім'я, що привласнюється вашою програмою осередку пам'яті, яка зберігає значення певного типу. Припустимо, наприклад, що змінні big і small знаходяться в осередках пам'яті 10 і 12. Якщо ви передасте змінні в функцію display_values, C ++ помістить копії значень цих змінних в стек. На рис. 10.1 показано, що далі функція display_values ​​буде використовувати копії значень змінних.

Мал. 10.1. C ++ розміщує копії значень параметрів в тимчасовому ділянці пам'яті, званому стеком.

Чому функції C ++ зазвичай не можуть змінити значення параметрів

ЗМІНА ЗНАЧЕННЯ ПАРАМЕТРА

void сhange_values ​​(int. * big, int. * small) ---> Покажчик на тип int

* Big = 1001;
* Small = 1001;

void change_values ​​(int * a, int * b)

* A = 1001;
* B = 1001;
cout <<"Значения в функции display_values" <<" равны " <<*а <<" и " <<*b <>

Коли ви откомпіліруете і запустіть цю програму, на екрані з'явиться наступний висновок:

C: \> CHGPARAM

Значення в функції display_values ​​рівні 1001 і 1001

Значення після функції 1001 і 1001

Зміна значень параметрів у функціях

void some_function (int * some_variable);

Далі всередині функції ви повинні вживати зірочку перед ім'ям змінної:

* Some_variable = 1 001;
cout <<*some_variable;

другий приклад

void swap_values ​​(float * a, float * b)

float big = 10000.0;
float small = 0.00001;
swap_values ​​(big, small);
cout <<"Big содержит " < cout <<"Small содержит " <>

void swap_values ​​(float * a, float * b)

Однак функція оголошує змінну temp просто як float, а не як покажчик на float. float temp;

Розглянемо наступний оператор:

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

Використання асемблерних листингов для кращого розуміння роботи компілятора

Кращим способом зрозуміти, як компілятор C ++ трактує покажчики, є дослідження ассемблерного виведення компілятора. Більшість компіляторів C ++ забезпечують ключ командного рядка, який ви можете використовувати, щоб вказати компілятору виводити асемблерний лістинг. Новомосковський асемблерний лістинг, ви можете краще зрозуміти, як компілятор використовує стек, коли передає параметри в функцію.

ЩО ВАМ ТРЕБА ЗНАТИ

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

З уроку 11 ви з'ясуєте, як функції бібліотеки етапу виконання, що забезпечуються компілятором C ++. можуть прискорити програмування, дозволяючи швидко розробляти складні програми. Однак до вивчення уроку 11 переконайтеся, що ви освоїли такі основні Концепції:

Конструктор uCoz