{
int temp=a;
a=b;
b=temp;
}
Main()
{
int x=3,y=6;
swap(x,y);
printf("x=%d,y=%d',x,y);
}
Результат роботи: x=3, y=6. Обмін не відбувся. Дійсно, у функції swap утворилися локальні копії фактичних параметрів-змінних x та y, вони помінялись місцями в тілі функції, а у функції main усе залишилось без змін. Для досягнення необхідного нам результату треба передати у функцію swap адреси відповідних змінних і здійснити обмін з їх використанням:
void swap(int a,int*b)
{
int temp=*a;
*a=*b;
*b=temp;
}
Main()
{
int x=3,y=6;
swap(&x,&y);
printf("x=%d,y=%d',x,y);
}
Масиви передаються у функції через адресу першого елемента, тому записи формального параметра у вигляді char*s, char s[10] та char s[ ] еквівалентні.
Компілятор виконує неявні перетворення типів формальних параметрів. Не може бути формального параметра типу, меншого ніж int, серед цілих типів, і ніж double – серед плаваючих.
С має специфічний механізм порядку передавання параметрів у функцію. Пригадаємо, що це відбувається, починаючи з останнього параметра (з кінця), що відрізняється від інших мов програмування.
|
|
Функції зі змінною кількістю параметрів
У мові С допускається сигнатура функції вигляду
(<тип1>ident1,<тип2>ident2,...)
Остання конструкція визначає функцію зі змінною кількістю параметрів. При виклику такої функції має бути вказана кількість параметрів, не менша від кількості явно заданих у визначенні:
Float (int a,int b,...)
{ …
}
...
a=f(1,2,4,4); /*вірно*/
a=f(1,2); /*вірно*/
a=f(2) /*невірно*/
Допускається також сигнатура вигляду
<СПКП><тип><опусивач>(...).
При цьому функція може мати довільну кількість параметрів, аж до їх відсутності.
Розглянемо роботу з функціями, що мають змінну кількість параметрів. Для організації доступу до першого невизначеного параметра можна описати в тілі функції покажчик на тип параметра та ініціалізувати його конструкцією вигляду