Аргументи функції

Функція is_in() має два параметри: s і d. Якщо символ c входить у рядок s , то ця функція повертає 1, інакше вона повертає 0.

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

Виклики за значенням та за посиланням

У мовах програмування є два способи передачі значень підпрограмі. Перший — виклик за значенням . При його застосуванні до формального параметра підпрограми копіюється значення аргументу. У такому разі зміни параметра на аргумент не впливають.

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

Проаналізуйте наступну програму:

У цьому прикладі параметр х копіюється 10 — значення аргументу для sqr() . Коли виконується привласнення х = х * х, модифікується тільки локальна змінна х. А значення змінної t , використаної як аргумент при викликі sqr() , як і раніше, залишається рівним 10. Тому виведено буде наступне: 100.10 .

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

Виклик за посиланням

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

І ось що вивела ця програма:

На заміткуМова C++ за допомогою параметрів-посилань дозволяє повністю автоматизувати виклик за посиланням. А в мові С параметри-посилання не підтримується

Виклик функцій за допомогою масивів

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

Ось що буде виведено у випадку фрази "This is a test." (це тест):

Щоправда, ця програма не працює із символами кирилиці.

Після виклику print_upper() вміст масиву s в main() перекладається символи верхнього регістру. Якщо вам це не потрібно, програму можна написати так:

Ось який цього разу вийде фраза "This is a test.":

На цей раз вміст масиву не змінився, тому що всередині print_upper() не змінювалися його значення.

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

Функцію xgets() слід викликати з покажчиком char*. Їм, звичайно, може бути ім'я символьного масиву, яке за визначенням є покажчиком char * . На початку програми xgets() виконується цикл for від 0 до 80. Це не дасть вводити з клавіатури рядки, що містятьпонад 80 символів. При спробі ввести більшу кількість символів відбувається повернення з функції. (У цій функції gets() такого обмеження немає.) Так як у мові С немає вбудованої перевірки кордонів, програміст повинен сам подбати, щоб у будь-якому масиві, що використовується при виклику xgets() , містилося не менше 80 символів. Коли символи вводяться з клавіатури, вони одразу записуються в рядок. Якщо користувач натискає клавішу , лічильник t зменшується на 1, а з масиву видаляється останній символ, введений перед натисканням цієї клавіші. Коли користувач натисне , до кінця рядка запишеться нуль, тобто. ознака кінця рядка. Оскільки масив, використаний для виклику xgets() , модифікується, то при поверненні з функції в ньому будуть введені користувачем символи.

[2] Звичайно, завдання, яке вирішується цією програмою, здається тривіальним. Ну хіба представляє труднощі написати якоюсь процедурною мовою, наприклад, на Алголі-60, процедуру, яка обмінює значення своїх параметрів. Адже так просто написати: procedure swap(x, y); integer х, y; begin integer t; t: = x; x:=y; y:=t end . Але ця процедура працює неправильно, хоча виклик значень тут відбувається за посиланням! Причому одразу знайти тестовий приклад, який демонструє хибність цієї процедури, вдається далеко не всім. Адже у разі виклику swap(i,j) все працює правильно! А що буде у разі виклику swap(i, a[i])? Та й чи можна на Алголі-60 взагалі написати потрібну процедуру? Якщо ви схиляєтеся до негативної відповіді, це показує, наскільки все-таки необхідні покажчики у розвинених мовами програмування. Якщо все ж таки ви знаєте правильну відповідь, то зверніть увагу на те, що необхідна процедура, хоча і не довга, але все ж таки містить свого роду програмістський фокус!

[4] Адже привиклик за значенням довелося б копіювати весь масив!