Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Формальні та фактичні параметри.

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

Список формальних параметрів забезпечують взаємодію процедури з головною програмою, а саме: передачу значень з головної програми в процедуру.

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

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

Приклад:

double line(double x, double a,double b)

{

return (a*x+b);

}

double /* тип результату (функції)

line /* назва функції

(double x, /* тип та ім'я першого параметра

double a, /* тип та ім'я другого параметра

double b) /* тип та ім'я третього параметра

{ /* тіло функції

return (a*x+b); /* значення, котре виробляє функція

}

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

Приклад:

void errmsg(char *s)

{

с<<"*** ПОМИЛКА ***\n"<<s;

}

 

Ця функція друкує повідомлення про помилку, текст повідомлення задається аргументом. Виклик цієї функції може мати, наприклад, такий вигляд:

errmsg("Ділення на нуль!");

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

Існує два способи виклику функцій:

<ім'я функцїї> (<список фактичних параметрів>)

або

(*<вказівник на функцію>)(<список фактичних параметрів>)

Вказівником на функцію є деякий вираз, значенням якого є адреса цієї функції.

В мовах програмування звичайно використовують два способи передачі переметрів: за значенням і за посиланням. При передачі параметра по значенню аргументом може бути довільний вираз, значення якого і передається в підпрограму. При передачі параметра по посиланню значенням може бути тільки змінна (як проста так і структурована).

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

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

В мові Сі використано третє рішення, тобто всі аргументи передаються по значенню, а для передачі аргументу по посиланню в підпрограму передається адреса потрібної змінної з допомогою операції отримання адреси об'єкта (&).

Вказівники дозволяють нам в одній змінній зберігати адрес іншої змінної. Для роботи з вказівниками використовуються дві операції: отримання адреси змінної (&) та вибір значення змінної з використанням вказівника (*). Щоб вказати компілятору те, що зміна є вказівником на значення деякого типу, перед іменем змінної ставлять зірочку (*).

Приклад:

char ch; Тут ch- значення символьного типу,
char *cptr; cptr - вказівник на значення символьного типу,
int val,*ivptr,n; vali n - значення цілого типу, а *ivptr - вказівник на значення цілого типу;
double r,*rp; r- змінна дійсного типу подвійної точності, а *rp - вказівник на змінну такого ж типу.

 

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

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

П р и к л а д:

/* Неправильне використання параметрів */ void change (int x, int y) { int k=x; x=y; y=k; }

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

П р и к л а д:

/* Правильне використання параметрів */

void change (int *x, int *y) { int k=*x; *x=*y; *y=k; }

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

Використання вказівників можна проілюструвати таким прикладом:


Читайте також:

  1. Етичні норми поведінки за столом під час ділових переговорів в неформальній обстановці.
  2. Запис рівнянь чотириполюсника через вторинні параметри.
  3. Коливання, їх типи і параметри.
  4. Метод фінансово-господарського контролю базується на загальнонаукових і специфічних (фактичні (органолептичні) і документальні) прийомах дослідження об’єктів.
  5. Мови як знакові системи. Природні та формальні мови. Алгоритмічні мови та мови програмування як приклади формальних мов.
  6. Необхідно розрізняти два класи ролей: конвенціональні і неформальні.
  7. Неформальні аспекти при розробці рішень
  8. Неформальні групи
  9. Неформальні канали
  10. Неформальні організації
  11. Неформальні організації
  12. Неформальні структури – ключ до креативності




Переглядів: 11161

<== попередня сторінка | наступна сторінка ==>
Приклад. | Приклад

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.146 сек.