С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/84: Рейтинг темы: голосов - 84, средняя оценка - 4.76
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Двумерный динамический массив: как это работает?

16.08.2018, 18:26. Показов 17738. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вобщем неправильно понимаю суть.
помогите разобраться.

двумерный динамический массив. в определении дается , что это объявление динамического указателя на укзатель. или двойного указателя.

ок. и так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main() {
int i;
for(i=0; i<10; ++i){
int ** array[i]  // создал массив в котором будут находится указатели на динамические массивы.  то есть массив из указателей на указатели.
int j;
j=j+1;
int *dinarray= new int [j]{j}; // cоздал , вернее зарезервировал память для динамического массива и заполнил его. 
 
array[i]=&dinarray; // помещаю адреса динамического одномерного массива в массив созданный для указателей  на эти адреса. то есть беру адрес у динамического массива и помещаю его в массив для адресов. 
}
 
return 0;
 
}
вобщем думаю что это бред. помогите понять где заблудился
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2018, 18:26
Ответы с готовыми решениями:

Пом Динамический - двумерный массив, не работает=(
//--------------------------------------------------------------------------- // Дана целочисленная квадратная матрица. Определить сумму...

Как реализовать двумерный динамический массив?
Доброго дня суток, форумчане! Подскажите пожалуйста, как реализовать двумерный динамический массив?

Как объявить двумерный динамический массив
int *matrix = new int ; че ругается ? а как сделать если без констант надо ?

90
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
16.08.2018, 18:46
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:

C++
1
2
3
4
5
6
7
int **array;
 
array = new int*[10]; // array указывает на массив указателей (10 штук) на тип int
 
// Для каждого указателя выделяем память под новый массив (из 100 элементов в данном случае)
for(int i = 0; i < 10; i++)
    array[i] = new int[100];
Таким образом имеем 10 строк по 100 символов.
2
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
16.08.2018, 18:54
При создании двумерного динамического массива сначала нужно выделить память для массива указателей на одномерные массивы (т.е указатель на указатель), а затем в цикле выделить память под эти самые одномерные массивы.
Миниатюры
Двумерный динамический массив: как это работает?  
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
16.08.2018, 19:01  [ТС]
Цитата Сообщение от JesD Посмотреть сообщение
При создании двумерного динамического массива сначала нужно выделить память для массива указателей на одномерные массивы (т.е указатель на указатель), а затем в цикле выделить память под эти самые одномерные массивы.

а я динамическую память только выделил для элементов , которые будут содержаться в **array, то есть для dinarray.
а сам array не имеет динамический.
правильно?
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
16.08.2018, 22:42
Компилятор запутается где-то на первой строчке внутри цикла.

В обычном коде редко встречается такое ручное управление памятью. Для одномерных динамических массивов есть std::vector. Для многомерных в стандарте пока неудобные классы. Можно найти где-нибудь в boost получше.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
17.08.2018, 00:11  [ТС]
ok


это я учебных целях
так навыдумывал себе, что запутался и вот решил лучше спросить. Выше написали простое создание этого массива, как правильно..
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.08.2018, 12:34
Простой статический массив ( заранее известной и не меняющейся длины )
https://en.cppreference.com/w/cpp/container/array

Простой динамический одномерный массив, в который можно добавлять и удалять элементы
https://en.cppreference.com/w/cpp/container/vector

Внизу обеих страниц - живой редактируемый пример, работу которого можно проверить онлайн на разных компиляторах.
Если будете проверять в своей системе, не забудьте подсказать компилятору версию C++ так, как описано в прикреплённой теме.

Из одномерных можно, например, собрать двумерные так, как Вам нарисовали.
1
17.08.2018, 16:57
 Комментарий модератора 
pcmax, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.3 (порядок именования тем).
0
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 5
26.06.2022, 18:51
Цитата Сообщение от JesD Посмотреть сообщение
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:

C++
1
2
3
4
5
6
7
int **array;
 
array = new int*[10]; // array указывает на массив указателей (10 штук) на тип int
 
// Для каждого указателя выделяем память под новый массив (из 100 элементов в данном случае)
for(int i = 0; i < 10; i++)
    array[i] = new int[100];
Таким образом имеем 10 строк по 100 символов.
Извините за ответ в мертвом треде, но у вас изначально ошибка в определении, в вашем случае это вложенный массив, а двумерный массив должен быть в одной области памяти, сам искал т.к. на плюсах не пишу, но тогда наверное проще сделать так для массива размерностью m, n обращение к элементу x, y
C++
1
2
3
int* array = new int[m * n];
 
array[x * n + y] = 10;
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
28.06.2022, 15:43  [ТС]
Цитата Сообщение от GazziFX Посмотреть сообщение
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:
ну так об этом речь что все не так просто... сначала надо понять, что указатель это просто адрес ячейки, которая может хранить другой адрес. но в С++ указатель может храниться в одном месте, а память под него выделиться в другом месте, а раз память выделиться в другом месте, и содержать он будет в себе другой адрес, то есть указатель, то не получиться чтобы весь массив хранился в одной области памяти, как вы выразились. Если честно то я не совсем понял, что вы понимали под этим. но спасибо что оживили такую замечательную тему
0
Заблокирован
28.06.2022, 16:01
Цитата Сообщение от GazziFX Посмотреть сообщение
в вашем случае это вложенный массив, а двумерный массив должен быть в одной области памяти
Почему должен ? Кому он должен ?

Цитата Сообщение от GazziFX Посмотреть сообщение
int* array = new int[m * n];
Это одномерный массив. То что вы логически, как то его интерпретируете , это уже дело 100500-ое.
Еще грубее и точнее, это указатель на объект типа int.

Цитата Сообщение от pcmax Посмотреть сообщение
ну так об этом речь что все не так просто...
Просто.
Цитата Сообщение от pcmax Посмотреть сообщение
сначала надо понять, что указатель это просто адрес ячейки
Нет, указатель - не просто адрес.

Цитата Сообщение от pcmax Посмотреть сообщение
Если честно то я не совсем понял, что вы понимали под этим. но спасибо что оживили такую замечательную тему
Цитата Сообщение от GazziFX Посмотреть сообщение
на плюсах не пишу
И чего вы от него хотите ?

Отличный же рисунок, от JesD, только в конце должен быть n-1.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.06.2022, 16:16
Цитата Сообщение от pcmax Посмотреть сообщение
двумерный динамический массив. в определении дается , что это объявление динамического указателя на укзатель
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int(*dinarray)[10] = new int [10][10]; 
 
    int v = 0;
    for(size_t y = 0; y < 10; ++y)
      for(size_t x = 0; x < 10; ++x)
        dinarray[y][x] = ++v;
        
    delete [] dinarray;
}
Цитата Сообщение от GazziFX Посмотреть сообщение
а двумерный массив должен быть в одной области памяти
верно.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему должен ?
см. определение термина "массив" в стандарте языка.
0
Заблокирован
28.06.2022, 16:18
Цитата Сообщение от hoggy Посмотреть сообщение
см. определение термина "массив" в стандарте языка.
А определение двумерного массива в стандарте можно сюда ?
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 01:33  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
определение термина
ребята, давайте так.... пусть каждый делает так как считает нужным. я понимаю, что стек и куча это все условные разделения и спорить тут сейчас у меня просто нет времени и желания.
для себя я понял только одно, что не надо слепо верить всяким стандартам и людям, которые пишут книжки и документации.

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Нет, указатель - не просто адрес.
я так не сказал. я сказал, что указатель это адрес ячейки памяти, в которой может храниться другой адрес. я ошибся? поправте пожалуйста
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
29.06.2022, 09:13
Цитата Сообщение от pcmax Посмотреть сообщение
указатель это адрес ячейки памяти, в которой может храниться другой адрес
Указатель - это тип данных, значением которого является адрес.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 16:02  [ТС]
Цитата Сообщение от Folian Посмотреть сообщение
Указатель - это тип данных

сами придумали?
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
29.06.2022, 16:16
Цитата Сообщение от pcmax Посмотреть сообщение
сами придумали?
C++
1
void* p;
Эт чё?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
29.06.2022, 21:11
Цитата Сообщение от SmallEvil Посмотреть сообщение
А определение двумерного массива в стандарте можно сюда ?
http://eel.is/c++draft/dcl.array#9
When several “array of” specifications are adjacent, a multidimensional array type is created;
и дальше по тексту.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 22:42  [ТС]
Цитата Сообщение от Folian Посмотреть сообщение
void* p;
это указатель на тип void.
а так
Code
1
int* A;
указатель на тип int. вобще надо бы определиться что есть вобще тип данных и для чего он. я считаю, что тип данных в плюсах необходим компилятору, чтобы он знал как с этим работать. когда вы указываете ему что это тип char, к примеру, то компилятор понимает сколько байт нужно выделить и тд. то есть тип определит размер ячейки памяти. пожалуйста не швыряйте стандартами и прочим. стандарты сегодня одни, а завтра -другие. сегодня вам говорят одно и вы дерете горло что-то утверждая, а завтра стандарты поменяются и возможно вы уже будете доказывать то, что еще вчера ненавистно и яростно оспаривали.
кстати
Code
1
void* P;
указатель на тип void способен хранить адрес на любой тип. ну а так если вы хотите сказать что вот такая последовательность символов char* -есть тип, то нужно помнить что char* также разыменовывает, но мы же не называет char* оператором. хотя почему бы и нет.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,016
29.06.2022, 23:15
pcmax, упрощённо можно считать так: указатель - это переменная, которая хранит адрес

Добавлено через 29 секунд
Цитата Сообщение от pcmax Посмотреть сообщение
void* P
P - это переменная
void* - это её тип

Добавлено через 1 минуту
Цитата Сообщение от pcmax Посмотреть сообщение
для себя я понял только одно, что не надо слепо верить всяким стандартам и людям, которые пишут книжки и документации.
стандартам надо верить слепо. Ну а люди иногда ошибаются, это да )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2022, 23:15
Помогаю со студенческими работами здесь

Как заполнить двумерный динамический массив?
вот я создал двумерный динамический массив (правильно надеюсь): int row=2; for (int i=0; i&lt;dl; i++){if ('!'==str){row+=1;}}; int...

Как перезаписать двумерный динамический массив?
Здравствуйте! Проблема в том, что при перезаписи массива с большой разницей в строках и столбцах функция работает не правильно. В чем может...

Как создать динамический двумерный массив
Можно ли создать на С++ динамический двухмерный масив? Как? int z , x ; cin &gt;&gt; z ; cin &gt;&gt; x ; int *arr = new int(z); int...

Как заполнить двумерный динамический массив?
Кто может объяснить , как создать динамический двумерный массив и записать в него элементы из файла, при этом подсчитав количество строк и...

Как создать динамический двумерный массив
Динамический одномерный массив p можно сождать примерно так: int N, *p; cin &gt;&gt; N; p= new int А как создать динамический...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru