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 програми бувають нудними.