Передача масиву у функцію

В даному уроці ми розглянемо як передавати звичайний масив у функцію в якості аргумента.

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

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

Розберемося як передавати масив у функцію.

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

Тепер розглянемо як це виглядатиме на практиці.

Оскільки аргументом функції виступатиме масив, то нам необхідно записати так (зараз розглядаємо одновимірний масив):


        Тип_масиву ім’я_масиву[]
        

Кількість квадратних дужок буде залежати від розмірності масиву.

Також, в якості аргументу функції обов’язково необхідно вказати розмір масиву (тобто, його довжину).

Розмір масиву ви можете відразу задати в квадратних дужках у функції, або в якості окремої змінної.

Коли ви будете передавати масив в якості аргументу, то необхідно буде вказати лише його не використовуючи квадратних дужок.

Задаємо розмір масиву відразу у функції:

    
            #include <iostream>

            void fun(int mas[4])
            {
                for(int i = 0; i < 4; i++)
                {
                    std::cout << mas[i] << " ";
                }
            }

            int main()
            {
                int mas[4] = {9, 8, 7, 6};
                fun(mas);
                return 0;
            }
        
    

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

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

    
            #include <iostream>

            const int length = 4;
            void fun(int mas[length])
            {
                for(int i = 0; i < length; i++)
                {
                    std::cout << mas[i] << " ";
                }
            }

            int main()
            {
                int mas[length] = {9, 8, 7, 6};
                fun(mas);
                return 0;
            }
        
    

Зверніть увагу, тут ми використовували змінну в якості довжини масиву у всіх місцях де її застосовували (довжину масиву). Тобто, за допомогою неї ми у функції задали розмір масиву, в циклі та при створенні масиву. Саме тому, використовуємо глобальну змінну. Щоб вона була доступна у всіх місцях де використовується довжина.

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

При цьому не потрібно вказувати розмір масиву у квадратних дужках при створенні функції.

    
            #include <iostream>

            //float m[] - вказуємо, що одним з аргументів
            //функції буде одновимірний масив
            //типу float
            //int length - змінна яка використовуватиметься
            //в якості довжини масиву
            void fun(float m[], int length)
            {
                for(int i = 0; i < length; i++)
                {
                    std::cout << m[i] << std::endl;
                }
            }

            int main()
            {
                float mas[4] = {9.1, 8.2, 7.3, 6.4};

                //зверніть увагу. коли передаємо масив
                //у функцію, то вказуємо лише його ім'я
                //в якості аргументу
                //"4" - це довжина масиву
                fun(mas, 4);

                return 0;
            }
        
    

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

Тобто, замість:


        void fun(float m[], int length)
        

Краще написати так:


        void fun(float m[], const int length)
        

Це гарантуватиме, що розмір масиву випадково не зміниться під час виконання програми.

Якщо ви працюєте лише з одновимірними масивами, то вважайте, що виграли Джекпот. Адже, робота з багатовимірними масивами має в собі безліч підводних каменів.

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

Розмір можна вказувати як числом відразу так і константною змінною.

    
            #include <iostream>

            //в даній функції ми вказуємо розміри масиву
            //відразу при створені функції
            void fun(int mas[2][3])
            {
                for(int i = 0; i < 2; i++)
                {
                    for(int j = 0; j < 3; j++)
                    {
                        std::cout << mas[i][j] << " ";
                    }
                    std::cout << std::endl;
                }
            }

            //використовуємо глобальні константні змінні
            //для задання розміру масиву
            const int row = 2;
            const int col = 3;
            void fun2(int mas[row][col])
            {
                for(int i = 0; i < row; i++)
                {
                    for(int j = 0; j < col; j++)
                    {
                        std::cout << mas[i][j] << " ";
                    }
                    std::cout << std::endl;
                }
            }

            int main()
            {
                int mas[2][3] = {{1, 2, 3}, {4, 5, 6}};
                //також можна використовувати константні значення
                //int mas[row][col] = {{1, 2, 3}, {4, 5, 6}};

                fun(mas);
                std::cout << std::endl << std::endl;
                fun2(mas);

                return 0;
            }
        
    

Якщо ви хочете вказати довжину у перших дужках окремою змінною, то відповідно пропускаєте (не вказуєте) у них число. У всіх наступних дужках довжина має бути завчасно вказаною. Можна використовувати як звичайне число так і глобальну константну змінну.

    
            #include <iostream>

            //у функцію ми передаємо двовимірний масив
            //int m[][3]
            //але потрібно відразу вказувати розмір
            //масиву по останніх дужках (стовпцях)
            //розмір масиву по перших дужках ми вказуємо
            //в якості аргументу функції
            void fun(int m[][3], int a)
            {
                for(int i = 0; i < a; i++)
                {
                    for(int j = 0; j < 3; j++)
                    {
                        std::cout << m[i][j] << " ";
                    }
                    std::cout << std::endl;
                }
            }

            int main()
            {
                int mas[2][3] = {{1, 2, 3}, {4, 5, 6}};

                fun(mas, 2);

                return 0;
            }
        
    

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

Зараз ми не розглядатимемо реальне а лише зміну значень чи заповнення. Тому, що для повернення масиву у нас ще мало знань.

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

Саме так. Щоб ми маємо Це виглядатиме ми створюємо масив, передаємо його у функцію, для прикладу заповняємо його значеннями, після чого наший початковий масив буде з тими ж значеннями.

    
            #include <iostream>

            //в даній функції ми створюємо масив
            //для заповнення його значеннями
            void fun(int mas[2][3])
            {
                for(int i = 0; i < 2; i++)
                {
                    for(int j = 0; j < 3; j++)
                    {
                        std::cout << "input: mas["<< i <<"]["<< j <<"] = ";
                        std::cin >> mas[i][j];
                    }
                }
            }

            //використовуємо глобальні константні змінні
            //для задання розміру масиву
            const int row = 2;
            const int col = 3;
            void fun2(int mas[row][col])
            {
                for(int i = 0; i < row; i++)
                {
                    for(int j = 0; j < col; j++)
                    {
                        std::cout << mas[i][j] << " ";
                    }
                    std::cout << std::endl;
                }
            }

            int main()
            {
                int mas[2][3];
                //також можна використовувати константні значення
                //int mas[row][col] = {{1, 2, 3}, {4, 5, 6}};

                //передаємо масив який хочемо заповнити значеннями
                fun(mas);
                std::cout << std::endl << std::endl;

                //виводимо наший масив
                fun2(mas);

                return 0;
            }
        
    

Розмір масиву ви можете передавати окремими аргументами.

Повернення масиву із функції

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

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

Для того щоб повернути масив із функції ми маємо:

1. Вказати тип масиву.

2. Поставити символ

3. Вказати ім’я функції.

4. При необхідності, вказати у круглих дужках аргументи функції.

5. В середині функції створити статичний масив або псевдо динамічний масив. Заповнити його необхідними значеннями.

6. При поверненні вказуємо лише масиву.

7. У програмі нам необхідно присвоїти дану функцію вказівнику такого ж типу як і сам масив.

8. З вказівником працюємо як із звичайним масивом.

Приклад програми:

        
            #include <iostream>
            #include <math.h>

            //вказуємо тип вказівника(масиву) який будемо повертати
            //не забуваємо поставити символ "*"
            int *fun()
            {
                //статичний масив
                int mas[3] = { 4, 15, 26 };

                //псевдо динамічний масив
                //int* mas = new int[3];
                //mas[0] = 4;
                //mas[1] = 15;
                //mas[2] = 26;

                //при поверненні вказуємо лише ім'я масиву
                return mas;
            }

            int main()
            {
                //створюємо вказівник такого ж типу як сам масив
                int* a;
                //присвоюємо значенню вказівника функцію яка має повертати масив
                a = fun();

                //звісно можна ініціалізувати вказівник відразу при створені
                //int* a = fun();

                //з вказівником працюємо як із звичайним масивом
                std::cout << a[0] << " " << a[1] << " " << a[2];

                return 0;
            }