5. Передача масивів у функцію
При передачі масивів у функцію передається покажчик на масив, тобто адреса першого елементу масиву. Функція в цьому випадку працює з масивом із зухвалої програми і тому може змінювати або перетворювати інформацію, яка безпосередньо міститься в даному масиві. Формат передачі адреси масиву у функцію має різний синтаксис. Наприклад, коди void f_1(int a[]), void f_1(int *a), void f_1(int а[10]) декларують передачу масиву а у функцію f_1. У всіх трьох випадках код виклику функції однаковий і має наступний синтаксис:
f_1(a), де а – масив, визначений в зухвалій програмі.
Програма fun_9. Програма вводить з клавіатури елементи масиву, а потім виводить введені дані на екран. Для введення і виведення елементів масиву використовуються функції.
void vvod(int *x); // x – покажчик.
void vivod (int *x);
const n = 10;
void main()
{
int w[n];
clrscr();
vvod(w); // Виклик функції введення елементів масиву.
vivod(w); // Виклик функції виведення елементів масиву на екран.
getch();
}
void vvod(int *y) // Функція введення елементів масиву, y – покажчик.
{ int i;
cout << “Введи елементи масиву: \n”;
for (i = 0; i < n; i++)
{
cout << "а(" << i << ")= ";
scanf("%d" &y[i]);
}
}
void vivod (int *z) // Функція виведення масиву на екран, z – покажчик.
{
int i;
cout << “\nВведен массив:\n”;
for (i = 0; i < n; i++)
cout << z[i] << " ";
cout << "\n";
}
Звернемо увагу на те, що імена локальних змінних у функціях різні.
При передачі двовимірного масиву у функцію треба переслати в неї адресу першого елементу масиву. Заголовок функції, в який передається двовимірний масив, може мати наступний синтаксис: void f_1( int x[][m]), де m – раніше оголошена константа. При такій формі передачі завдання розміру m (числа елементів в рядку) обов'язково.
Програма fun_10.
const n = 3, m=2;
void vvod(int x[][m]); // Функція введення елементів матриці.
void vivod (int x[][m]); // Функція виведення елементів матриці.
void main()
{
int w[n][m];
clrscr();
vvod(w); // Виклик функції введення елементів матриці.
vivod(w); // Виклик функції виведення елементів матриці на екран.
getch();
}
void vvod(int y[][m])
{ int i, j;
cout << “Введи елементи матриці: \n”;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{ cout << "а(" << i << "<< j << ")= ";
scanf("%d" &y[i][j]);
}
}
void vivod (int z[][m])
{
int i, j;
cout << “\nВведена матрица:\n”;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
cout << z[i][j] << " ";
cout << "\n";
}
cout << "\n"; }
Якщо функція використовується для декількох двовимірних масивів різної розмірності, то двовимірний масив треба інтерпретувати як одновимірний. Синтаксис заголовка функції в даній ситуації буде наступним:
Void f_1 (int *X, int n, int m)
Тут x – покажчик на перший елемент матриці; m, n – розмір матриці. У тілі функції доступ до елементів матриці при такому зверненні можна здійснити лише через адреси до елементів.
Програма fun_11. Функція введення матриці з файлу використовується для матриць різного розміру.
const n1 = 3, m1=2;
const n2 =3, m2 = 3;
void vvod(int *x, int n, int m);
void vivod (int *x, int n, int m);
void main()
{ int а, b[n2][m2];
clrscr();
vvod(а, n1, m1); // Виклик функції введення елементів матриці.
vivod(а, n1, m1); // Виклик функції виведення елементів матриці.
vvod(b[0],n2,m2);
vivod(b[0],n2,m2);
getch(); }
// Функція введення елементів матриці.
void vvod( int *c, int n, int m) // Введення елементів матриці з клавіатури.
{ int i, j; // Індекси для елементів матриці.
cout << “Введи елементи матриці: \n”;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
cout << “x(” << i << “<< j << “)= “;
scanf(“%d”, з + i * m + j); // i * m + j – порядковий номер елементу
// матриці з індексом i, j. x + i * m + j – адреса цього елементу.
} }
// Функція виведення елементів матриці на екран.
void vivod( int *c, int n, int m) // Виведення елементів матриці.
{ int i, j;
cout << “\nВведена матрица:\n”;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
// i * m + j – порядковий номер елементу матриці з індексом i, j.
printf("%d ", *(з + i * m + j)); // з + i * m + j – адреса цього елементу.
printf ("\n");
} }