Тема: Масиви та вказівники
Як створити вказівник для двовимірного масиву таким чином, щоб до елементів даного масиву можна було звертатися через вказівник?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → 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");
}
Як створити вказівник для двовимірного масиву таким чином, щоб до елементів даного масиву можна було звертатися через вказівник?
Звертатись можно пор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 програми бувають нудними.
В 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;
}
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися