C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C функції. Передача параметрів в функцію


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

тип назва_параметра

Наприклад, визначимо функцію для обчислення факторіала:

#include <stdio.h>
 
void factorial(int n)
{
    int result = 1;
    for(int i = 1; i <= n; i++)
    {
        result *= i;
    }
    printf("factorial of %d is equal %d \n", n, result);
}
 
int main(void)
{
    factorial(4);
    factorial(6);
    return 0;
}

// RESULT:
// factorial of 4 is equal 24
// factorial of 6 is equal 720

Функція factorial приймає один параметр, який має ім'я n і тип int .

У методі main ця функція викликається два рази, і кожного разу їй передається нове значення для параметра n . Передане значення для параметра ще називається аргументом . У підсумку функція виведе на консоль факторіали чисел 4 і 6:

Прототип функції factorial виглядав би наступним чином:

void factorial(int n);

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

#include <stdio.h>
 
void exchange(double currate, double sum)
{
    double result = sum / currate;
    printf("result=%.2f \n", result);
}
 
int main(void)
{
    double rate;
    double sum;

    // ввід обмінного курсу іноземної валюти
    printf("Currency rate:");
    scanf("%lf", &rate);
 
    // ввід суми в заданій валюті
    printf("Sum:");
    scanf("%lf", &sum);
 
    // обмін - передавання значень змінних
    exchange(rate, sum);
     
    // обмін - передавання числових констант
    exchange(56.87, 2000);
     
    return 0;
}

// RESULT:
/*
Currency rate: 56
Sum: 56000
result = 1000,00
result = 35,17
*/

За допомогою функції scanf() здійснюється введення даних з консолі для змінних rate і sum , потім ці змінні як аргументи передаються в функцію exchange . Змінні, що використовуються в якості аргументів, необов'язково повинні називатися саме так, як параметри функції. Відповідність між аргументами і параметрами встановлюється по їх розташуванню:

перший аргумент передає значення для першого параметра,

другий аргумент - для другого параметра і так далі.

І крім того, тут другий виклик функції exchange в якості аргументів отримує числові константи.

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

Наприклад, вище використовувалася функція void factorial(int n) . Якщо ми передамо в factorial значення іншого типу, то компілятор буде намагатися привести їх до типу int :

factorial(4.56);
double f = 0.53e+1;
factorial(f);

Фактично це буде аналогічно наступному коду:

factorial((int)4.56);
double f = 0.53e+1;
factorial((int)f);

Процес передачі параметрів

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

#include <stdio.h>
 
void add(int a, int b, int c)
{
    a = a + c;
    b = b + c;
    printf("Add function: a=%d \t b=%d \n", a, b);
}
int main(void)
{
    int a = 20, b = 14;
     
    printf("Main function before add: a=%d \t b=%d \n", a, b);
     
    add(a, b, 30);
     
    printf("Main function after add: a=%d \t b=%d \n", a, b);
     
    return 0;
}

// RESULT:
/*
Main function before add: а = 20 b = 14
Add function: а = 50 b = 44
Main function after add: а = 20 b = 14
*/

У функцію add передаються три числа, де до першого і до другого число послідовно додається третє.

У функції main виводимо перед і після виконання функції add значення змінних a і b , які передаються в add в якості аргументів.

І при виконанні ми побачимо, що зміни аргументів у функції add діють тільки в рамках цієї функції. Поза її значення змінних a і b залишаються незмінними:

Чому так відбувається? При компіляції функції для її параметрів виділяються окремі ділянки пам'яті. При цьому для параметрів типу float формуються в пам'яті об'єкти типу double , а для параметрів типів char і short int - об'єкти типу int .

При виконанні функції обчислюються значення аргументів, які передаються на місце параметрів. І потім значення аргументів заносяться в ділянки пам'яті, відведені для параметрів. При цьому значення типу float перетворюються в об'єкти типу double , а об'єкти типів char і short int - в об'єкти типу int .

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


Наш партнер:
beta test mp3 playlist downloader