Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / lexs_5_param.DOC
Скачиваний:
12
Добавлен:
17.05.2015
Размер:
92.67 Кб
Скачать

Лекція 5. Передача параметрів в функціях

Формальний параметр – покажчик скалярної змінної.

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

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

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

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

Приклад оголошення функції з формальним параметром покажчиком:

void fun (int i, int *j);

В якості формальних параметрів функції fun використовуються:

  • і –ім’я скалярної змінної;

  • j – ім’я покажчика на дані типу int.

Приклад виклику функції fun:

fun (a, &b); де а,b – імена змінних.

Передаються в функцію fun в якості фактичних параметрів і копіюються в ОП, виділену в стеку для її формальних параметрів:

  • для і – значення результату виразу – фактичного параметра (в окремому випадку це може бути копія значення змінної а);

  • для j – адреса змінної – фактичного параметра: &b.

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

fun (k, &m); fun (k+3, &m);

При виклику цієї функції в якості фактичного параметра може бути також ім’я покажчика на змінну того ж типу. Наприклад, якщо в функції, що викликає оголосити:

int k, m,*p; …. p=&m;

то виклик функції може бути у вигляді:

fun (k, p);

Результат виконання функції – значення змінної, розташованої за адресою р, може бути використаний у викликаючій функції у вигляді *р – вмісту, на який вказує р.

Домашнє завдання Скласти програму, яка повертає значення суми за допомогою покажчика в списку параметрів: а, b– імена змінних типуint;

s – ім‘я покажчика на змінну типу int– результат виконання функції.

Приведемо приклад програми з функцією swap для того , щоб змінити місцями значення даох змінних. Формальними параметрами є покажчики р1 і р2 на ці змінні, а фактичними – адреси змінних: &a, і &b.Ця задача не може бути вирішена без параметрів – покажчиків.

# include <conio.h>

# include <stdio.h>

FILE *f; // покажчик для файла результату

void main ()

{ void swap (float *p1, float *p2); // оголошення функції

float a=2.5; b=3.7;

// f= fopen (“0.9. rez”, “w”); // для виведення у файл

f=fopen (“con”, “w”); // для виведення на екран

clrscr ();

fprintf (f, “\na=%.1f_b=%.1f”, a, b); // виведення початкових даних

swap (&a, &b); // фактичні параметри – адреси: &a i &b

fprintf (f, “\na= %.1f b=%.1f”, a,b); // виведення результату

fclose (f);

printf (“\n Для завершення натисніть будь- яку клавішу \n”)

getch ();

} // закінчення функції main

//---- функція змінює місцями значення фактичних пар:

void swap (float *p1, float *p2) // p1 i p2 – покажчики

{ float r=*p1; *p1 = *p2; *p2 = r;}

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