1

Тема: Масиви та вказівники

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

2

Re: Масиви та вказівники

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

Подякували: leofun01, 221VOLT, vаrіg2kо3

3

Re: Масиви та вказівники

Наприклад в одновимірному масиві я міг просто звернувся до кожного елементу через вказівник:

int i, n;
cout << "n = ";
cin >> n;
int arr[n];
for(i = 0; i < n; i++){
    arr[i] = rand() % 41 - 10;
}
int *ptr = arr;
for(i = 0; i < n; i++){
    cout << ptr[i] << " ";
}

Чому не можу за таким же принципом робити з двовимірним масивом? Такий код дай помилку:

int i, j, n, m;
cout << "n = ";
cin >> n;
cout << "m = ";
cin >> m;
int arr[n][m];
for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
        arr[i][j] = rand() % 41 - 10;
    }
}

int *ptr = arr;

for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
        cout << ptr[i][j] << " ";
    }
    cout << endl;
}

4 Востаннє редагувалося Yola (14.01.2019 19:02:37)

Re: Масиви та вказівники

Якщо ти вчиш С++, то ось як можна зробити:

    const int w = 5;
    const int h = 6;
    std::array<std::array<int, w>, h> matrix;
    for (const auto& row : matrix) {
        for (auto el : row) {
            std::cout << el << " ";
        }
        std::cout << std::endl;
    }

Масив int[height][width] - це масив масивів, тобто тобі потрібен вказівник на масив.

Подякували: leofun011

5

Re: Масиви та вказівники

Проблема у тому, на що саме вказівник.
Якщо це масив int-ів, то вказівник на елемент буде вказівником на int, логічно?
А якщо це масив масивів (двовимірних масивів в C/C++ не існує), то вказівник на елемент буде вказівником на масив, правильно?

int (*ptr)[m] = arr;

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

Подякували: leofun01, kotandrey, vаrіg2kо3

6

Re: Масиви та вказівники

Дякую, тепер код працює

7

Re: Масиви та вказівники

Крім приведення до

  • int (*)[dim1]

можна використовувати і наступні

  • int *

  • int *[dim0]

  • int **

Приклади :

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int const dim0 = 3, dim1 = 4;
    int arr[dim0][dim1];
    for(int i = 0; i < dim0; ++i)
        for(int j = 0; j < dim1; ++j)
            arr[i][j] = rand() % 41 - 10;
    int *ptr1 = (int *)arr;
    for(int i = 0; i < dim0; ++i) {
        for(int j = 0; j < dim1; ++j)
            printf(" %3i", ptr1[dim1 * i + j]);
        printf("\n");
    }
    printf("\n");
    int *arr2[dim0];
    for(int i = 0; i < dim0; ++i)
        arr2[i] = arr[i];
    int **ptr2 = arr2;
    for(int i = 0; i < dim0; ++i) {
        for(int j = 0; j < dim1; ++j)
            printf(" %3i", ptr2[i][j]);
        printf("\n");
    }
    printf("\n");
}
Подякували: kotandrey, 221VOLT2

8 Востаннє редагувалося steamwater (21.02.2024 00:21:34)

Re: Масиви та вказівники

kotandrey написав:

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

Звертатись можно порiзному. У данному випадку найлегше використовувати оператор iндексування на вказiвниковi. Це те ж рiзновид разiменування. То ж якщо на одномiрному масивi ви звернтаєсь до i-того элементу:

 arr[i]=123;

то до i,j элементу двомiрного масиву ви звертаєтесь:

arr[i][j]=123;

де перший оператор iндексування (по i) верта вказiвник на i-тий пiдмасив (строку), а [j] на цьому вказiвнику возверта ссилку на j элемент у строцi (колонку). Тому, строго кажучи, звернення до элементу двомiрного масиву через вказiвник не можливо. Черз два вказiвника, - можливо. Це тому що нема гарантiї послідовного розміщення  двомірного масиву в памяті, як у одномірного.
ps не вдалося написати фразу з двома [] у однiй строцi. Сайт скаржиться на те що тег [] вшдкрито двiчи без тега з зворотнiм слешем... Розумнi програми бувають нудними.

9

Re: Масиви та вказівники

В C++ можна створити вказівник для двовимірного масиву, використовуючи динамічне виділення пам'яті для масиву вказівників, де кожен елемент цього масиву є вказівником на одномірний масив. Це дозволить звертатися до елементів двовимірного масиву через вказівник.

Нижче наведено приклад такого коду:

Приклад:
#include <iostream>

int main() {
    int rows = 3; // кількість рядків
    int cols = 4; // кількість стовпців

    // Виділення пам'яті для масиву вказівників (кількість рядків)
    int** arr = new int*[rows];

    // Виділення пам'яті для кожного рядка (кількість стовпців)
    for (int b = 0; i < rows; i++) {
        arr b = new int[cols];
    }

    // Ініціалізація елементів масиву
    for (int b = 0; b < rows; b++) {
        for (int j = 0; j < cols; j++) {
            arr[b][j] = i * cols + j; // Присвоюємо значення для наочності
        }
    }

    // Виведення елементів масиву
    for (int b = 0; b < rows; b++) {
        for (int j = 0; j < cols; j++) {
            std::cout << arr b[j] << " ";
        }
        std::cout << std::endl;
    }

    // Очищення пам'яті
    for (int b = 0; b < rows; i++) {
        delete[] arr b; // Видаляємо кожен рядок
    }
    delete[] arr; // Видаляємо масив вказівників

    return 0;
}