Вказівник на масив

Вказівники це один з найпотужніших інструментів мови програмування Вказівники це те за, що програмісти обожнюють та ненавидять

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

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

В першу чергу розберемося як це можна зробити із одновимірними масивами.

Для того щоб створити вказівник нам потрібно:

1. Вказати тип вказівника який має бути таким же як тип масиву на який він вказує.

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

3. Вказати ім’я вказівника.

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

5. Вказати ім’я масиву на який буде вказувати даний вказівник.

Це виглядатиме так:


        Тип_вказівника * ім’я_вказівника = ім’я_масиву_на_який_вказує_вказівник;
        

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

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

Наприклад:

    
            #include <iostream>

            int main()
            {
                int mas[5] = {9, 8, 7, 6, 5};
                int *p_mas = mas;

                //програма виведе «9»
                std::cout << *p_mas << std::endl;

                return 0;
            }
        
    

Для того щоб отримати значення інших елементів масиву потрібно зробити так:

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

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

Наприклад:

    
            #include <iostream>

            int main()
            {
                int mas[5] = {9, 8, 7, 6, 5};
                int *p_mas = mas;

                //Програма виведе перший елемент. Тобто "9"
                std::cout << *p_mas << std::endl;

                //Програма виведе третій елемент. Тобто "7".
                //Пам'ятаємо, що відлік починається з "0",
                //тому третій елемент буде під номером "2".
                std::cout << *(p_mas + 2) << std::endl;

                return 0;
            }
        
    

В даній ситуації будьте обережні, адже дуже легко вийти за межі масиву.

Даний метод можна використовувати наприклад, для заповнення та виведення елементів масиву:

    
            #include <iostream>

            int main()
            {
                const int size = 5;
                int mas[size];
                int *p_mas = mas;

                //заповнюємо наший масив елементами
                for(int i = 0; i < size; i++)
                {
                    std::cout << "input number: ";
                    std::cin >> *(p_mas + i);
                }

                std::cout << std::endl;

                //виводимо значення (елементи) нашого масиву
                for(int i = 0; i < size; i++)
                    std::cout << *(p_mas + i) << " ";

                return 0;
            }
        
    

Зверніть увагу. Коли ви використовуєте запис ви кожного разу починаєте з Не забувайте, що вказувати потрібно на менше.

Використання дужок є обов’язковим, адже без них ви виконаєте додавання елементу масиву і числа.

Наприклад:

    
            #include <iostream>

            int main()
            {
                const int size = 5;
                int mas[size] = {9, 7, 5, 3, 1};
                int *p_mas = mas;

                //виводимо нульовий елемент
                std::cout << *p_mas << std::endl;

                //дужок не має. тому це буде нульовий елеммент + 1
                std::cout << *p_mas + 1 << std::endl;

                //виводимо перший елемент (тобто, "7")
                std::cout << *(p_mas + 1) << std::endl;

                return 0;
            }
        
    

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

Наприклад:

    
            #include <iostream>

            int main()
            {
                const int size = 5;
                int mas[size] = {9, 7, 5, 3, 1};
                int *p_mas = mas;

                //"початковим" елементом є елемент під номером "0"
                std::cout << *p_mas << std::endl;

                //тепер елемент який є "початковим" йде під номером "1"
                std::cout << *++p_mas << std::endl;

                //тут не має "++" але "стартовим" елементом залишається "1"
                std::cout << *p_mas << std::endl;

                return 0;
            }
        
    

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

    
            #include <iostream>

            int main()
            {
                const int size = 5;
                int mas[size] = {9, 7, 5, 3, 1};
                const int *p_mas = mas;

                for(int i = 0; i < size; i++)
                    std::cout << *(p_mas + i) << " ";

                return 0;
            }
        
    

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

    
            #include <iostream>
            int main()
            {
                int mas[4] = { 9,8,7,6 };
                int* m = mas;

                for (int i = 0; i < 4; i++)
                    std::cout << m[i] << " ";

                return 0;
            }
        
    

В ситуаціях, коли ви хочете створити вказівник на багатовимірний масив, то вам необхідно:

1. Вказати тип вказівника.

2. У круглих дужках поставити символ Після чого вказати вказівника.

3. У квадратних дужках вказати всі розміри масиву крім першого. Кожен розмір масиву вказується в окремих квадратних дужках.

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

5. Записати масиву на який ми хочемо вказувати.

Приклад вказівника на двовимірний масив:

    
            #include <iostream>
            int main()
            {
                //Створення вказівника на багатовимірний масив.
                //
                //Для кращого розуміння де і які розміри масиву
                //використовуються ми задаємо їх за допомогою
                //константних змінних
                const int row = 2, col = 3; //розміри масиву

                int mas[row][col] = { {4, 5, 6}, {7, 8, 9} };

                //Створюємо вказівник на багатовимірний масив.
                //Як бачите, нам необхідно ім'я вказівника взяти у
                //круглі дужки і лише там поставити символ "*".
                //Зверніть увагу, що ми не вказуємо перший розмір
                //масиву (тобто, не має "[row]"), але при цьому
                //ми зобов'язані вказувати всі наступні розміри
                //не залежно скільки їх буде
                int (*m)[col] = mas;

                for (int i = 0; i < row; i++)
                {
                    for (int j = 0; j < col; j++)
                    {
                        //З вказівником на багатовимірний масив
                        //ми можемо працювати без проблем як із
                        //звичайним багатовимірним масивом
                        std::cout << m[i][j] << " ";
                    }
                    std::cout << std::endl;
                }

                return 0;
            }
        
    

Логіка тут доволі проста. Вказівник вказує на перший елемент будь-якого рядка, але він не знає скільки стовпців є в даному рядку. Тому, ми маємо вказати це самостійно.

Приклад вказівника на тривимірний масив:

    
            #include <iostream>
            int main()
            {
                //Створення вказівника на багатовимірний масив.
                const int x = 2, y = 3, z = 4; //розміри масиву

                int mas[x][y][z] = { {{4, 5, 6, 3}, {7, 8, 9, 2}, {1, 5, 9, 13}}, {{11, 12, 13, 14}, {25, 26, 27, 28}, {91, 92, 93, 94}} };

                int (*m)[y][z] = mas;

                for (int i = 0; i < x; i++)
                {
                    for (int j = 0; j < y; j++)
                    {
                        for(int k = 0; k < z; k++)
                            std::cout << m[i][j][k] << " ";

                        std::cout << std::endl;
                    }
                    std::cout << std::endl << std::endl;
                }

                return 0;
            }
        
    

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