Тема: Масиви та вказівники
Як створити вказівник для двовимірного масиву таким чином, щоб до елементів даного масиву можна було звертатися через вказівник???
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C/C++ → Масиви та вказівники
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Як створити вказівник для двовимірного масиву таким чином, щоб до елементів даного масиву можна було звертатися через вказівник???
Яким чином би ви не створили двовимірний масив, до його елементів можна буде звертатися через вказівник. До будь-якого об'єкту в пам'яті можна звертатися через вказівник, власне, не існує іншого способу звернутися до об'єкта в пам'яті, просто іноді компілятор від вас ці вказівники приховує.
Може, переформулюєте питання, наведете зразки коду?
Наприклад в одновимірному масиві я міг просто звернувся до кожного елементу через вказівник:
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;
}
Якщо ти вчиш С++, то ось як можна зробити:
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] - це масив масивів, тобто тобі потрібен вказівник на масив.
Проблема у тому, на що саме вказівник.
Якщо це масив int-ів, то вказівник на елемент буде вказівником на int, логічно?
А якщо це масив масивів (двовимірних масивів в C/C++ не існує), то вказівник на елемент буде вказівником на масив, правильно?
int (*ptr)[m] = arr;
Взагалі я би мав спитати, нащо це вам, але виходитиму з того, що якщо ви ставите таке вузьке питання, то вам і відповідь потрібна так само вузька.
Крім приведення до
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");
}
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися